我有一个小的示例程序来说明以下问题:我有一个简单的文本文件,其中包含三个单词(每个单词都换行),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()

    07-24 09:51
    查看更多