функция strtok () и тип смешанной переменной в C - PullRequest
0 голосов
/ 03 декабря 2018

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

...
0087|www.google.com|2017.08.07 12:13:36
0150|www.yahoo.com|2018.10.06 04:03:12
...

, где типы данных разделены на |,Затем я использую strtok() для разделения данных, это хорошо работает для обоих типов строк timestamp и domain, я смог правильно хранить данные в структуре, однако для типа данных customerid ятолько получить адрес памяти в структуре, как я могу решить это?Спасибо!

#include <stdio.h>
#include <string.h>

struct AccessRecord {       
    int customerID;         
    char domain[256];
    char timestamp[21]; 
    };

struct AccessRecord rc[1000];


int main()
{
    int i = 0; char line[300]; 
    const char s[2] = "|";

    FILE *fd;
    fd = fopen("./example_data.ipb","r");


    while (fgets(line, sizeof(line), fd)) {

        char *token;

        token = strtok(line, s);

        rc[i].customerID = token;
        token = strtok(NULL, s);

        strcpy (rc[i].domain , token);
        token = strtok(NULL, s);


        strcpy (rc[i].timestamp , token);
        token = strtok(NULL, s);

        i++;
    }
    fclose(fd);

    return 0;
}

1 Ответ

0 голосов
/ 03 декабря 2018

Обратите внимание на два различных способа извлечения данных:

token = strtok(line, s);
rc[i].customerID = token;       // assignment of char* (to int, so suspect)

token = strtok(NULL, s);
strcpy (rc[i].domain , token);  // string copying

Это несмотря на тот факт, что оба являются строками.Хотя идентификатор клиента представляет собой числовые данные , он хранится в виде строки и должен рассматриваться как таковой.

Другими словами, поскольку в структуре это целое число, его можно преобразоватьво время чтения, например, с:

token = strtok(line, s);
rc[i].customerID = strtol(token, NULL, 10);
...