我有一个小的示例程序来说明以下问题:我有一个简单的文本文件,其中包含三个单词(每个单词都换行),fscanf会读取该单词,将其分配给一个临时变量,然后再将其传输到字符串数组。但是,这些值似乎没有转移到数组中。另外,当我在while循环中从第二个printf中删除注释//时,出现段错误。
我刚接触C,所以现在才学习这些功能的用法!在此先感谢您的协助!
#include <stdio.h>
#include <string.h>
int main (int argc, char* argv[])
{
char* words[15];
char tmp[45];
int i = 0;
FILE* fp = fopen("small", "r");
while (fscanf(fp, "%s", tmp) == 1)
{
printf("%s\n", tmp);
words[i] = tmp;
i++;
//printf("%s ", words[i]);
}
printf("\n");
printf("Words 0 = %s\n", words[0]);
printf("Words 2 = %s\n", words[1]);
printf("Words 3 = %s\n", words[2]);
fclose(fp);
}
输出量
pears
apples
zipper
Words 0 = zipper
Words 2 = zipper
Words 3 = zipper
最佳答案
在您的代码中,words[i] = tmp;
并不是将每个输入存储到words
数组的方法。该操作仅将tmp
数组的基地址存储到每个words[i]
中,然后在打印时,实际上在每次迭代时都打印tmp
的最新内容。
如果要将tmp
数组的内容放入每个words[i]
中,则需要
words[i]
分配内存,并使用strcpy()
strdup()
并将其分配给words[i]
。 无论哪种情况,您都必须在退出之前对分配的内存进行
free()
。