1

我有一个文本文件,类似于以下内容:

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() 弄乱了数据,但我可能错了。

我在这里做错了什么?

先感谢您!

4

4 回答 4

2

在调用之前readlist或之后,您从未初始化结果。

只需在调用之前添加readliststrcpy(result, "");

于 2013-04-30T03:30:25.190 回答
2
char result[2048];

初始化此语句,否则结果将包含垃圾值作为其auto变量。

所以 use char result[2048] = "";beforereadlist()在你的main函数中被调用。

于 2013-04-30T03:34:57.253 回答
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';

将以零长度开始字符串 - 后面的任何内容都无关紧要。这可能是最干净的。

于 2013-04-30T03:49:12.780 回答
1

确保初始化result为空字符串。任何一个

char result[2048] = "";

在调用者中,或

result[0] = '\0';

在 readlist() 的顶部。

于 2013-04-30T03:29:50.560 回答