如何在C中将文本文件中的字符串存储在数组中

如何在C中将文本文件中的字符串存储在数组中,c,arrays,string,C,Arrays,String,我希望将文本文件读入字符串数组,并能够通过循环访问数组内容。我的代码允许我只存储文本文件的最后一行,而不是整个文件;我哪里做错了 #define MAX 10000 int main (int argc, char *argv[]) { FILE *fp; char str[MAX]; char *x[MAX]; int i =0; char y[MAX]; if((fp = fopen("550.txt", "r"))==NULL) {

我希望将文本文件读入字符串数组,并能够通过循环访问数组内容。我的代码允许我只存储文本文件的最后一行,而不是整个文件;我哪里做错了

#define MAX 10000

int main (int argc, char *argv[])
{
    FILE *fp;
    char str[MAX];
    char *x[MAX];
    int i =0;
    char y[MAX];

    if((fp = fopen("550.txt", "r"))==NULL) {
    printf("Cannot open file.\n");
    exit(1);}

    while(!feof(fp)) {
        while(fgets(str, sizeof str, fp)) {
            x[i]= str;
            printf("%s", str);
            printf("%s", *(x+i));
            i++;
        }
  }


for(i=0;i<100;i++){
    printf("%s", *(x+i));
}

   fclose(fp);

  return 0;
}
#定义最大10000
int main(int argc,char*argv[])
{
文件*fp;
字符str[MAX];
字符*x[MAX];
int i=0;
chary[MAX];
if((fp=fopen(“550.txt”,“r”))==NULL){
printf(“无法打开文件。\n”);
退出(1);}
而(!feof(fp)){
while(fgets(str,sizeof str,fp)){
x[i]=str;
printf(“%s”,str);
printf(“%s”,*(x+i));
i++;
}
}
对于(i=0;i您只分配一个字符串数组
str
。在循环的每次迭代中,您只需覆盖
str
。赋值
x[i]=str
str
的指针值分配给
x[i]
。您会注意到数组的每个成员
x
都指向循环末尾的相同缓冲区
str
。您需要创建多个缓冲区

一种方法是使用
#定义行100
定义最大行数,然后声明
x
,如下所示

char x[LINES][MAX];
然后在每次迭代时执行strcpy

while(fgets(str, sizeof str, fp)) {
    strcpy(x[i], str);
    printf("%s", str);
    printf("%s", *(x+i));
    i++;
}

注意,您应该考虑使用<代码> StrncPy < /Cult>方法,而不是<代码> StrcPy < /代码>,并检查返回值,以确保缓冲区不会溢出。

< P>您需要复制每个字符串:

x[i] = strdup(str);
您目前正在做的是使每个
x[i]
指向同一个缓冲区,一旦完成,该缓冲区将包含文件的最后一行


(注意:您还需要
free()
使用
strdup()
创建的所有
x[i]
字符串)

您没有在任何地方对读取的行进行笔划。它会缓冲到str中,但会用下一行覆盖它。请使用strdup>

x[i] = strdup(str);

不要使用feof()来控制循环条件。您确定fgets不会为长输入零终止缓冲区吗?