我在while循环中添加了一些字符串。一切都很好,似乎在while循环中添加,但是当我离开while循环并循环遍历数组来检查值时,最后添加的值出现在所有索引中。
以下是代码:
char buffer[50];
char *keys[1000] = {""};
int count = 0;
FILE *file = fopen(argv[1], "r");
if (file == NULL) {
return 1;
}
while (fgets(buffer, 100, file) != NULL) {
buffer[strlen(buffer) - 1] = '\0';
printf("Buffer being read: %s\n", buffer);
keys[count] = buffer;
printf("Buffer after storing: %s, index: %d\n", keys[count], count);
count++;
if (count == 3) {
break;
}
}
printf("Reading from stored array\n");
printf("%s, index: %d\n", keys[0], 0);
printf("%s, index: %d\n", keys[1], 1);
printf("%s, index: %d\n", keys[2], 2);
这是输出:
Buffer being read: 0DJz9J/xOBK/chDRPFvOwg==
Buffer after storing: 0DJz9J/xOBK/chDRPFvOwg==, index: 0
Buffer being read: IHKA7WHFdhQIRpqFmqT1ew==
Buffer after storing: IHKA7WHFdhQIRpqFmqT1ew==, index: 1
Buffer being read: TtD7k1Z+4PFLfl46xWOZgQ==
Buffer after storing: TtD7k1Z+4PFLfl46xWOZgQ==, index: 2
Reading from stored array
TtD7k1Z+4PFLfl46xWOZgQ==, index: 0
TtD7k1Z+4PFLfl46xWOZgQ==, index: 1
TtD7k1Z+4PFLfl46xWOZgQ==, index: 2
正如你所看到的,在我离开while循环之后,不知何故,这些值被神奇地覆盖了。
任何可能导致此问题的想法?
由于
答案 0 :(得分:3)
您的代码中存在多个问题:
buffer
的定义大小为50,您将最大大小100传递给fgets
:
fgets(buffer, 100, file);
您应该改为增加缓冲区大小并使用sizeof
来保持同步使用和定义:
fgets(buffer, sizeof buffer, file);
此外,在成功'\n'
之后,您不应该假设缓冲区包含最终fgets
。如果文件没有以换行结束,则最终读取不会将一个存储到缓冲区中。删除最终'\n'
(如果存在)的简单可靠方法是:
buffer[strcspn(buffer, "\n")] = '\0';
您将buffer
的地址存储在keys
数组中的所有条目中:
keys[count] = buffer;
请注意,这不会复制数组的内容,只会存储其地址。因此keys
中的所有条目都指向同一缓冲区,其中读取最后一行的内容(如果到达文件末尾,则甚至是未定义的内容)。您可以通过分配字符串的副本来解决此问题:
keys[count] = strdup(buffer);
但请记住在返回此功能之前释放所有这些字符串。