【问题标题】:fscanf variable not setting correctly. possibly realloc()fscanf 变量设置不正确。可能 realloc()
【发布时间】:2012-11-06 05:08:03
【问题描述】:

当文件 fileIn 的单词正确且按顺序打印时,输出显示所有数组值都是“焦虑”。我的问题可能出在 realloc() 中?

    ReadIn = malloc(sizeof(char) * 50);

    while(fscanf(fileIn, "%s", ReadIn) != EOF){
        wordlist = (char **)realloc( wordlist, (numwords + 1) * sizeof(char*));
        printf("%s\n",ReadIn);
        wordlist[numwords] = ReadIn;
        numwords++;
    }

    for(i = 0; i < numwords; i++){
        printf("%d %s\n", i , wordlist[i]);
    }

输出:

This
is
a
journey
into
fear
and
anxiety.
0 anxiety.
1 anxiety.
2 anxiety.
3 anxiety.
4 anxiety.
5 anxiety.
6 anxiety.
7 anxiety.

【问题讨论】:

    标签: c arrays scanf


    【解决方案1】:

    您使每个数组指针指向ReadIn 缓冲区,该缓冲区将包含最后读入的字符串。

    您想复制读入的每个字符串:

    //change: wordlist[numwords] = ReadIn;
    wordlist[numwords] = strdup(ReadIn);
    

    您还应该注意在使用完 wordlist 数组后释放每个字符串。

    如果您的编译器的运行时库没有非标准但常见的strdup() 函数,那么它很容易实现(或找到公共域版本)。

    【讨论】:

    • Program4.c:在函数“main”中:Program4.c:49:警告:函数“strdup”的隐式声明 Program4.c:49:警告:赋值使指针从整数不进行强制转换
    • 有效!谢谢。我只是不喜欢这些错误。使用迂腐的 ansi 和 Wall
    • @Jared: #include &lt;string.h&gt; 应该得到正确的strdup() 声明。
    【解决方案2】:

    wordlist[numwords] = ReadIn;

    在上面的行中,您只是分配了“ReadIn”的地址而不是字符串。所以从“ReadIn”中包含的文件中读取的最后一个字符串被重复打印了。

    所以,您需要将读取的字符串复制到您的字符串数组中,

    strcpy(wordlist[numwords], ReadIn);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-17
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多