strtok()没有按预期工作

时间:2016-12-06 04:37:48

标签: c strtok

我正在使用strtok()函数在换行符分隔符上拆分文件缓冲区,但我得到的结果并不是我的预期。

patient->fullName = strtok(fileContent, "\n");
patient->dateOfBirth = strtok(NULL, "\n");
patient->height = strtok(NULL, "\n");
patient->waistMeasurement = strtok(NULL, "\n");
patient->weight = strtok(NULL, "\n");
patient->comment = strtok(NULL, "\n");

当我将分隔值保存到struct成员中时,除了第一个成员fullName之外,每个成员都会在以后显示正常。如果我做对了,它会显示地址值。这是输出:

enter image description here

由于我还不熟悉C,你能不能告诉我怎样才能得到实际写在文件中的全名来代替这个指针地址?

修改

创建fileContent

FILE *file = fopen(fileName, "r");

fseek(file, 0, SEEK_END);
long size = ftell(file);
rewind(file);

char *fileContent = malloc(size + 1);
fread(fileContent, size, 1, file);

病人:

struct Patient
{
    char *fullName;
    char *dateOfBirth;
    char *height;
    char *waistMeasurement;
    char *weight;
    char *comment;
};

struct Patient *patient = malloc(sizeof(*patient));

patient->fullName = malloc(sizeof(NAME_LENGTH));
patient->dateOfBirth = malloc(sizeof(BIRTHDAY_LENGTH));
patient->height = malloc(sizeof(HEIGHT_LENGTH));
patient->waistMeasurement = malloc(sizeof(WAIST_LENGTH));
patient->weight = malloc(sizeof(WEIGHT_LENGTH));
patient->comment = malloc(sizeof(COMMENT_LENGTH));

文件内容保存在文件中(虽然已加密):

Qevms Wqspgmg
49.46.5336.
534,9
84,7
28,6
Li'w jygomrk eaiwsqi hyhi!

1 个答案:

答案 0 :(得分:3)

请注意,使用malloc()时,strtok()来电分配的空间全部丢失 - 您正在泄露。您需要使用strcpy()将字符串复制到分配的空间中。在复制之前,您需要检查是否分配了足够的空间。或者您可以使用POSIX函数strdup() - patient->fullName = strdup(strtok(fileContent, "\n"));。 (这有点风险;我通常会在将strtok()传递给strdup()之前检查其返回情况 - 但它确实是重点。)

另外,因为您要将指针复制到fileContent,如果您将下一行读到fileContent,它将更改前一个{{1}指向的字符串的值记录。或者,当patient超出范围并用于其他目的时,数据将再次更改。