簡體   English   中英

C strtok和strcpy

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM