我有一个文本文件,类似于以下内容:
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()弄乱了数据,但我可能错了。
我在这里做错了什么?
提前谢谢!
答案 0 :(得分:2)
在调用readlist
之前或之后,您从未初始化结果。
只需在致电readlist
之前添加:strcpy(result, "");
答案 1 :(得分:2)
char result[2048];
初始化此语句,否则结果将包含垃圾值作为其auto
变量。
因此,在char result[2048] = "";
函数中调用readlist()
之前使用main
。
答案 2 :(得分:1)
确保将result
初始化为空字符串。任
char result[2048] = "";
在来电者中,或
result[0] = '\0';
位于readlist()的顶部。
答案 3 :(得分:1)
我运行了你的代码(或者至少,我从你的代码片段中创建了一个程序),它对我来说很好用:
#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';
将以零长度启动字符串 - 以下任何内容都无关紧要。这可能是最干净的。