![](/img/trans.png)
[英]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.