作为练习,我构建了一个简单的程序,给定一个N
小写单词和空格的文本文件,填充一个参差不齐的数组char *en[N]
。
它的工作没有太大的问题,除了一个:它只用输入的最后一个字填充参差不齐的数组。
#include<stdio.h>
#include<ctype.h>
int main(int argc, char *argv[]){
int i = 0, j = 0;
char *en[100];
char temp[20];
FILE *p = fopen(argv[1], "r");
char single;
while((single = fgetc(p)) != EOF){
if(!isspace(single)) /* Temporary store a single word */
temp[i++] = single;
else{
temp[i] = '\0';
en[j++] = temp; /* Save stored word in ragged array */
i = 0;
}
}
printf("%s\n", en[0]); /* Return the same than en[1] and en[99] */
printf("%s\n", en[1]);
printf("%s\n", en[99]);
return 0;
}
我无法理解为什么它会一直到输入文件的末尾。我无法发现可能暗示错误做法的重大问题。
修改
我的方法背后的原因是可以用这种形式初始化*char
数组:
p[0] = "abc";
推测我错误地试图在上面的错误中翻译,@coderredoc出色地抓住了。就单个词和输入的维度而言,我承认我没有多少关注它们。练习以不同的主题为中心。无论如何,非常感谢您宝贵的建议!
答案 0 :(得分:4)
您的charcaters数组都指向同一个char数组,然后数组的内容最后更改为最后一个单词。你得到只最后一个字。
可能的解决方案
en[j++] = temp;
到
en[j++] = strdup(temp);
然后,您将实现您希望程序拥有的行为。
答案 1 :(得分:2)
你刚刚发现了指针的精彩,恭喜!
说真的,char *en[100]
是一个指针数组。 en[j++] = temp;
将指向temp
的第一个值的指针指定给en[j++]
处的指针。你一遍又一遍地这样做。毫不奇怪,你最终得到一个指针数组,所有指向同一个数组temp
,它保存最后一个单词的内容。
从中学到什么:指针只指向某个内存,并且在执行en[j++] = temp;
时不会发生内存复制。您必须自己将和复制temp
的内存分配给新内存。