[英]char array in structs - why does strlen() return the correct value here?
[英]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.