我试图将文本文件中的行读入char数组,但是有些错误。请查看代码,让我知道我做错了什么。 感谢。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i=0,j;
char* string[100];
char line[100];
FILE *file;
file = fopen("patt", "r");
while(fgets(line, sizeof line, file)!=NULL) {
printf("%d %s",i, line);
string[i]=line;
i++;
}
for (j=0 ; j<i ; j++) {
printf("string[%d] %s",j, string[j]);
}
fclose(file);
return 0;
}
输入文件patt具有以下内容。
rec
cent
ece
ce
recent
nt
在执行上面的代码时我得到了这个
0 rec
1 cent
2 ece
3 ce
4 recent
5 nt
string[0] nt
string[1] nt
string[2] nt
string[3] nt
string[4] nt
string[5] nt
我期待的是这个
0 rec
1 cent
2 ece
3 ce
4 recent
5 nt
string[0] rec
string[1] cent
string[2] ece
string[3] ce
string[4] recent
string[5] nt
答案 0 :(得分:3)
您反复写入同一个数组。
while(fgets(line, sizeof line, file)!=NULL) {
在这一行中,您反复写入数组line
。
我认为你误解了char* string[100];
的作用。您将它用作数组数组,而它实际上是一个包含100个指针的数组。
要解决此问题,您需要先在每次迭代中分配一个新的内存块:
string[i] = malloc(strlen(line)+1);
然后您需要将line
的内容复制到string[i]
:
strcpy(string[i], line);
此外,在程序结束时,您需要使用free
来释放内存。
答案 1 :(得分:2)
您的string[i]=line;
表示您重复将指向同一缓冲区(line
)的指针存储到string
中的每个连续项目中。像这样:
为了使事情有效,您需要为每个要指定的缓冲区分配一个新的缓冲区,例如:string[i] = dupe_string(line);
,其中dupe_string
将类似于:
char *dupe_string(char const *in) {
char *dupe;
if (NULL != (dupe = malloc(strlen(in) + 1)))
strcpy(dupe, in);
return dupe;
}
请注意,由于这使用malloc
为每个字符串分配空间,因此最终需要为每个字符串调用free
以避免内存泄漏。
答案 2 :(得分:1)
帮助您理解代码:
string[i]
写line
的地址,而数组line
的内容在整个循环中不断变化。
这导致所有string[i]
包含相同变量的地址,即line
。
在循环结束时,从文件读取的最后一行存储在line
数组中。现在,在打印字符串[i]时,您正在打印变量line
中的数据。由于字符串[i]的所有实例都包含line
的相同地址,因此它们都在打印相同的值,即输出中的nt
。int main(void) { int i=0,j; char* string[100]; char line[100]; FILE *file; file = fopen("patt", "r"); while(fgets(line, sizeof(line), file)!=NULL) {//You missed the ()'s in the sizeof printf("%d %s",i, line); string[i]=line; i++; }
*你应该做的是:
int main(void) {
int i=0,j;
char* string[100];
char line[100];
FILE *file;
file = fopen("patt", "r");
while(fgets(line, sizeof(line), file)!=NULL) {//You missed the ()'s in the sizeof
printf("%d %s",i, line);
string[i]=malloc(strlen(line)+1); ///You need to allocate some memory to char* string[i] here
if(string[i] == NULL)//Do a NULL check if malloc failed
//Handle NULL here
strncpy(string[i],line,strlen(line)+1);//Use strncpy to copy line into the malloced memory in string[i]
i++;
}
现在,由于您已经使用内存来存储用于存储数据的内存,因此您也需要释放内存。 所以,代替你的代码:
for (j=0 ; j<i ; j++) {
printf("string[%d] %s",j, string[j]);
}
fclose(file);
return 0;
}
这样做:
for (j=0 ; j<i ; j++) {
printf("string[%d] %s",j, string[j]);
free(string[j]);
}
fclose(file);
return 0;
}
现在,那应该能给你你想要的东西。