繁体   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