C strtok和strcpy

时间:2013-04-30 03:27:33

标签: c parsing strtok 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()弄乱了数据,但我可能错了。

我在这里做错了什么?

提前谢谢!

4 个答案:

答案 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';

将以零长度启动字符串 - 以下任何内容都无关紧要。这可能是最干净的。