为什么我总是得到我的字符串数组的最后一个元素?

Jon*_*Jon 1 c string buffer

我试图从文本文件中读取所有字符串并将它们保存在字符串数组中.但是,当我尝试打印我的字符串数组的内容时,只打印最后一部分.为什么我的代码只复制最后一个字符串?

我的代码

# include <stdio.h>
# define BUFFERSIZE 100

int main(int argc, char *argv[]){
   char buffer[BUFFERSIZE];

   int i = 0;
   char *text[BUFFERSIZE];

   while(fgets(buffer, BUFFERSIZE, stdin) != NULL){
          text[i] = buffer;
          i++;
   }

   int j = 0;
   for (j=0; j<sizeof(text)/sizeof(char); i++){
          printf("%s\n", text[j]);
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的文字文件

ESD can create spectacular electric sparks (thunder and lightning is a large-scale ESD       event), but also less dramatic forms which may be neither seen nor heard, yet still be large enough to cause damage to sensitive electronic devices.
Electric sparks require a field strength above about 4 kV/cm in air, as notably occurs in lightning strikes. Other forms of ESD include corona discharge from sharp electrodes and brush discharge from blunt electrodes.
Run Code Online (Sandbox Code Playgroud)

产量

>>> make 1_17; ./1_17 < example.txt
m blunt electrodes.

m blunt electrodes.

m blunt electrodes.

m blunt electrodes.

...
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 5

有两个问题.首先,对于你所有人来说i,text[i]包含你多次使用的相同缓冲区.第二个是在您的打印代码中,您只是打印text[0].

使用相同的缓冲区

只声明了一个缓冲区,

char buffer[BUFFERSIZE];
Run Code Online (Sandbox Code Playgroud)

当你在循环中多次修改它的内容时,它总是相同的缓冲区(即内存中的相同存储区域),所以

text[i] = buffer;
Run Code Online (Sandbox Code Playgroud)

使每个元素text包含(地址)相同buffer.您需要内容复制buffer到新字符串中并将其存储text[i].您可以使用,例如,strdup如果您可以使用POSIX函数复制字符串,如

text[i] = strdup(buffer);
Run Code Online (Sandbox Code Playgroud)

strdup使用malloc分配空间的字符串,所以如果你在一个较大的应用程序中使用此,请务必free后来这些字符串.但是,在您的简单应用程序中,当应用程序退出时它们将被释放,因此您不会遇到太多麻烦.

如果你只能使用标准的C函数,你可能会想要strcpy哪些会让你做更多的工作.(你需要分配一个足够大的字符串来保存当前内容buffer,然后将buffer内容复制到其中.之后你仍然会想要free它们.

仅打印 text[0]

但是,您的打印代码也存在问题.你索引到textj,但从来没有改变j(你递增ii++),所以你总是打印相同的字符串(这实际上是第一个数组中,不到最后,但它的内容是一样的LSAT你从文件中读取的字符串):

 int j = 0;
 for (j=0; j<sizeof(text)/sizeof(char); i++){
        printf("%s\n", text[j]);
 }
Run Code Online (Sandbox Code Playgroud)

在第一个循环之后,i是你已经获得的字符串数量,所以你可能只想要:

int j;
for ( j=0; j < i; j++ ) {
  printf("%s\n", text[j]);
}
Run Code Online (Sandbox Code Playgroud)