[英]C strtok and strcpy
我有一個文本文件,類似於以下內容:
Name1: ID1
Name2: ID2
Name3: ID3
我正在嘗試解析它以獲得
Name1
Name2
Name3
存儲在變量中。
我寫了以下函數:
/*
* filename Name of file to read
* result The result will be stored here
*/
void readlist(char* filename, char* result) {
FILE *fp;
char buffer[2048];
memset((void *)result, '\0', BUFFER_SIZE);
fp = fopen(filename, "r");
while (fgets(buffer, sizeof(buffer), fp)) {
char *token = NULL;
token = strtok( buffer, ":" );
strcat(result, token);
}
fclose(fp);
}
但是當我稱它為:
char result[2048];
readlist("test.txt", result);
printf("%s", result);
我得到一個空的輸出。 看來strtok()弄亂了數據,但我可能錯了。
我在這里做錯了什么?
先感謝您!
在調用readlist
之前或之后,您從未初始化過結果。
只需在調用readlist
之前添加: strcpy(result, "");
char result[2048];
初始化此語句,否則結果將包含垃圾值作為其auto
變量。
因此,使用char result[2048] = "";
在main
函數中調用readlist()
之前。
確保將result
初始化為空字符串。 要么
char result[2048] = "";
在呼叫者中,或
result[0] = '\0';
在readlist()的頂部。
我運行了您的代碼(或者至少是從您的代碼片段創建了一個程序),它對我來說很好用:
#include <stdio.h>
#include <string.h>
void readlist(char* filename, char* result);
int main(void) {
char result[2048];
readlist("test.txt", result);
printf("%s", result);
}
void readlist(char* filename, char* result) {
FILE *fp;
char buffer[2048];
fp = fopen(filename, "r");
while (fgets(buffer, sizeof(buffer), fp)) {
char *token = NULL;
token = strtok( buffer, ":" );
strcat(result, token);
}
fclose(fp);
}
當我在您的輸入文件上運行它時,我得到了輸出
Name1Name2Name3
完全符合預期。
這是在Mac OS上使用的gcc編譯器版本4.2.1。 這表明您的代碼並沒有您想像的那么遠(顯然,編譯器在啟動之前是否將字符串初始化為0取決於實現)。 為了安全起見,您需要確保初始結果全為零。 你可以做
char result[2048] = {'\0'};
這將確保所有元素都初始化為零。 另一種方法是使用
static char result[2048];
由於任何聲明為static
變量都將初始化為零。
最后,像
result[0] = '\0';
將以零長度開始字符串-緊隨其后的無關緊要。 這可能是最干凈的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.