1

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

我的代码

# 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;
}

我的文本文件

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.

输出

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

m blunt electrodes.

m blunt electrodes.

m blunt electrodes.

...
4

3 回答 3

5

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

使用相同的缓冲区

只声明了一个缓冲区,

char buffer[BUFFERSIZE];

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

text[i] = buffer;

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

text[i] = strdup(buffer);

strdup用于malloc为字符串分配空间,因此如果您在较大的应用程序中使用它,请确保free稍后再使用这些字符串。但是,在您的简单应用程序中,它们将在应用程序退出时被释放,因此您不会遇到太多麻烦。

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

仅打印text[0]

但是,您的打印代码也有问题。您正在索引textwith j,但从不修改j(您正在增加iwith i++),因此您始终打印相同的字符串(实际上是数组中的一个,而不是最后一个,但它的内容与 lsat 相同您从文件中读取的字符串):

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

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

int j;
for ( j=0; j < i; j++ ) {
  printf("%s\n", text[j]);
}
于 2013-10-30T17:44:29.503 回答
3

此外,除了已经发布的答案之外,您i还在 for 循环中递增,而不是j.

于 2013-10-30T17:50:21.350 回答
1

看看这个循环:

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

您将数组的每个元素设置为完全相同的值: 的值buffer,它是指向一块内存的指针。在每次迭代中,您都在上次读取数据的顶部读取数据。

要解决此问题,您需要在每次迭代时分配一个缓冲区,并将数组值设置为指向该新缓冲区的指针。这样,数组的每个元素都将指向不同的内存部分。

于 2013-10-30T17:45:44.957 回答