используйте strtok для разделения строки и сохранения в структуре

#arrays #c #struct #structure #strtok

#массивы #c #struct #структура #strtok

Вопрос:

думаю, мне следует перефразировать свой вопрос. у меня есть структура, подобная приведенной ниже:

 struct profile {
    char name[30];
    int age, phoneNo;
};
  

у меня есть файл со строками, которые выглядят следующим образом:

 James Brown,35y,0123456789
Mary Brown,45y,0123987456
  

в настоящее время я написал код для поиска записи с использованием имени / возраста / phoneNo человека, и я хотел бы сохранить записи в структуре, которая у меня есть. я пытаюсь использовать strtok для отделения данных от запятой, но мой код не работает.

 int main()
{
    char search[50];
    char record[50];
    const char s[2] = ",";
    char* token;
    struct profile c;

    FILE* fPtr;
    if (fPtr = fopen("profile.txt", "r"))
    {
        // flag to check whether record found or not
        int foundRecord = 0;
        printf("Enter name to search : ");
        // fgets gets name to search
        fgets(search, 50, stdin);
        //remove the 'n' at the end of string
        search[strcspn(search, "n")] = 0;

        
        while (fgets(record, 50, fPtr))
        {
            // strstr returns start address of substring in case if present
            if (strstr(record, search))
            {
                token = strtok(record, s); 

                while (strtok != NULL)
                {

                    scanf("%s", c.name);
                    token = strtok(record, s);
                    scanf("%d", c.age);
                    token = strtok(record, s);
                    scanf("%d", c.phoneNo);
                    token = strtok(NULL, s);

                    printf("Your details: ");
                    printf("%s, %d, %dn", c.name, c.age, c.phoneNo);

                }
                
                foundRecord = 1;
            }
        }
        if (!foundRecord)
            printf("%s cannot be foundn", search);

        fclose(fPtr);
    }
    else
    {
        printf("File cannot be openedn");
    }
}
  

я никогда strtok раньше не использовал, и я не уверен, как хранить каждый токен в каждой переменной структуры. может кто-нибудь объяснить мне, как я могу исправить strtok функцию в своем коде?

Комментарии:

1. Прочитайте описание функции strtok . Вы можете найти его в Интернете.

2. @VladfromMoscow я читал о strtok в Интернете, но я не знаю, как применить его к структурам.

Ответ №1:

Как указано в комментариях, вы можете легко прочитать строку, разделенную запятыми, используя strtok . Вы можете использовать atoi / sscanf для извлечения целочисленного значения из age . Я немного изменил ваш код, чтобы читать из файла для назначения структурному массиву:

 // Array for storing Profiles
struct profile profiles[2];

FILE* fPtr;
if (fPtr = fopen("profile.txt", "r")) {
    int index = 0;
    while (fgets(record, 50, fPtr) != NULL) {
        // Extract name
        char *pStr = strtok(record, ",");
        if (pStr != NULL) {
            strcpy(profiles[index].name, pStr);
        }
        // Extract Age
        pStr = strtok(NULL, ",");
        if (pStr != NULL) {
            profiles[index].age = atoi(pStr);
        }
        // Extract Phone No
        pStr = strtok(NULL, ",");
        if (pStr != NULL) {
            profiles[index].phoneNo = atoi(pStr);
        }
        index  ;
    }

    for (int i = 0; i < 2; i  ) {
        printf("%s %d %dn", profiles[i].name, profiles[i].age, profiles[i].phoneNo);
    }
     
    fclose(fPtr);
}
  

Когда я запустил это, я смог увидеть ожидаемый результат:

 src : $ cat profile.txt 
James Brown,35y,0123456789
Mary Brown,45y,0123987456
src : $ gcc readfiletostructarr.c 
src : $ ./a.out 
James Brown 35 123456789
Mary Brown 45 123987456
  

Комментарии:

1. большое вам спасибо! это помогло мне получить представление о том, как strtok работает со структурами, и я уверен, что теперь я могу запрограммировать свой. я действительно ценю это, хорошего дня! 🙂

2. Np, я рад, что смог помочь 🙂