簡體   English   中英

C - 為什么 char 數組只返回放入其中的最后一個值?

[英]C - Why does char array only return last value that's put into it?

我正在用 C 編寫。我試圖從文本文件中讀取行,解析該行,並將一些信息放入字符串數組中。 當我測試我的代碼時,數組中的每個值似乎都是插入的最后一個值。 這是什么原因造成的?

int r;
char *users[51]; //given no more than 50 users
for (r = 0; r < 51; r++) {
    int n = 15; //arbitrary guess at length of unknown usernames
    users[r] = malloc((n + 1) * sizeof(char));
}
FILE *fp;
fp = fopen(argv[1], "r");

char *username;

int counter = 0;
char line[100];
while (fgets(line, 100, fp) != NULL) {
    username = strtok(line, ":");

    users[counter] = username;
    printf("%s\n", username);
    printf("%s\n", users[counter]);

    //counter increase for later
    counter += 1;

您將一個合理的值放入數組中的每個條目中:

users[r] = malloc((n+1) * sizeof(char));

但是然后你用一個無意義的值(指向line的指針)覆蓋它:

users[counter] = username;

您可能想要做的是將username指向的字符串復制到users[counter]分配的空間中。 strcpy函數可以做到這一點。

strtok是一個非常令人困惑的函數:

  • 它修改它接收到的指針的數組
  • 它返回一個指向該數組元素的指針。
  • 它保持一個內部狀態,使其不可重入和非線程安全。

因此username指向line 您將此指針存儲到users[counter] 在循環結束時, users所有條目都指向同一個數組,該數組已被每次調用fgets()覆蓋。

您應該使用strdup()復制數組的內容:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[) {
    char *users[51]; //given no more than 50 users
    int r;
    FILE *fp;

    if (argc < 2) {
        fprintf(stderr, "missing filename argument\n");
        return 1;
    }
    fp = fopen(argv[1], "r");
    if (fp == NULL) {
        fprintf(stderr, "cannot open file %s\n", argv[1]);
        return 1;
    }
    char line[100];
    int counter = 0;
    while (counter < 50 && fgets(line, 100, fp) != NULL) {
        char *username = strtok(line, ":");
        if (username != NULL) {
            users[counter] = strdup(username);
            //counter increase for later
            counter += 1;
        }
    }
    users[counter] = NULL;

    ...
}

我想補充一下大衛的回答,在使用strcpy()之前,您還應該檢查用戶名字符串是否以空結尾。 我不記得strtok() null 是否終止,但無論如何你都不應該依賴它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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