我正在尝试从文本文件中读取所有字符串,并将它们保存在字符串数组中。但是,当我尝试打印字符串数组的内容时,仅打印最后一部分。为什么我的代码只复制最后一个字符串?
# 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.
...
有两个问题。第一个是,对于您所有人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]
但是,您的打印代码也有问题。你索引到text
有j
,但从来没有改变j
(你递增i
用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]);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句