2016-12-06 333 views
0

我正在使用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"); 

當我保存分隔的值成結構成員的每一個成員顯示細膩以後除了第一個,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

在用'strtok()'剪切它之前,顯示存儲在'fileContent'中的值是明智的。顯示「病人」指向的結構的定義也是明智的。這些是使這個位置靠近MCVE([MCVE])的基本要求 - 雖然你仍然可以說是偏離了最低限度。 –

+2

請注意,由'malloc()'調用分配的空間全部因使用'strtok()'而丟失 - 您正在泄漏。您需要使用'strcpy()'將字符串複製到分配的空間中。在複製之前,您需要檢查是否分配了足夠的空間。或者你應該使用'strdup()'''patient-> fullName = strdup(strtok(fileContent,「\ n」));'。此外,因爲您正在複製指向'fileContent'的指針,所以如果您將下一行讀入'fileContent',它將更改之前'patient'記錄指向的字符串的值。或'fileContent'超出範圍並被用於其他目的。 –

+0

@JonathanLeffler非常感謝。這對我有效。 – msmolcic

回答

3

請注意,malloc()呼叫分配的空間全部因使用strtok()而丟失 - 您正在泄漏。您需要使用strcpy()將字符串複製到分配的空間中。在複製之前,您需要檢查是否分配了足夠的空間。或者你可以使用POSIX功能strdup() - patient->fullName = strdup(strtok(fileContent, "\n"));。 (這是一點點冒險。我通常將它傳遞給strdup()前檢查從strtok()回 - 但它使點)

而且,因爲你複製指針fileContent,如果你讀下一行成fileContent,它會改變前面的patient記錄所指向的字符串的值。或者,當fileContent超出範圍並用於其他目的時,數據將再次更改。

+0

非常感謝。我在這個函數的作用域內使用了fileContent來從文本文件中讀取數據並將值保存到結構體中,但是將字符串值複製到分配的空間中並沒有做到這一點。 – msmolcic