我正在尝试将c文件的每一行添加到数组中。 files.txt的内容是
first.c
second.c
third.c
fourth.c
我希望我的代码打印每一行,将行添加到我的数组,然后打印出我的数组中的每个条目。现在它正确地执行了第一部分,但它只是将第四部分添加到数组中。有人能告诉我我的代码有什么问题吗?
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i=0;
int numProgs=0;
char* programs[50];
char line[50];
FILE *file;
file = fopen("files.txt", "r");
while(fgets(line, sizeof line, file)!=NULL) {
//check to be sure reading correctly
printf("%s", line);
//add each filename into array of programs
programs[i]=line;
i++;
//count number of programs in file
numProgs++;
}
//check to be sure going into array correctly
for (int j=0 ; j<numProgs+1; j++) {
printf("\n%s", programs[j]);
}
fclose(file);
return 0;
}
答案 0 :(得分:1)
您需要更改
programs[i]=line;
到
programs[i]=strdup(line);
否则programs
数组中的所有指针都将指向同一位置(即line
)。
BTW:如果 files.txt 包含超过50行,您将遇到麻烦。
答案 1 :(得分:0)
你需要为每一行分配新的存储空间,否则你只有1行缓冲区来存储文件名,所以只显示最后一行,在while循环中执行此操作:
programs[i] = calloc(strlen(line)+1, 1);
strcpy(programs[i], line);
答案 2 :(得分:0)
不需要i
并保存所有指向数组中行的指针,您必须使用strdup()
。就这样做:
programs[numProgs++] = strdup(line);
在第二个循环中,条件必须为j < numProgs
。
为while循环添加附加条件以防止写入通过数组的结尾:
while(fgets(line, sizeof line, file)!=NULL && numProgs < 50)
答案 3 :(得分:0)
当声明char *programs[50]
不是有效指针时。因此,您可以根据每个行大小为每个指针分配内存。所以,尝试这个..(这里我使用的是malloc&amp; strcpy)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main(void) {
int i=0;
int numProgs=0;
char* programs[50];
char line[50];
FILE *file;
file = fopen("files.txt", "r");
while(fgets(line, sizeof line, file)!=NULL) {
//check to be sure reading correctly
printf("%s", line);
//add each filename into array of programs
programs[i]=malloc(sizeof(line));
strcpy(programs[i],line);
i++;
//count number of programs in file
numProgs++;
}
//check to be sure going into array correctly
for (int j=0 ; j<numProgs+1; j++) {
printf("\n%s", programs[j]);
}
fclose(file);
return 0;
}