【问题标题】:Undefined characters in string after reading file with fgetc()使用 fgetc() 读取文件后字符串中的未定义字符
【发布时间】:2018-03-19 05:53:02
【问题描述】:

我正在尝试编写一个简单的代码来读取标准输入,然后使用它,所以我尝试输入一个小程序,以便将我的标准输入放在一个定义大小的表中,它看起来像这样:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main(int argc, char *argv[]){   
    int c , i = 0 ;
    char str[1024];

    while(c != EOF){
        c = fgetc(stdin);
        str[i]=c;
        i++;
    }
    printf("%s\n",str);
    return 0;
}

当我用

运行程序时
$ test < file.json

我明白了:

{
    "num": 8
}�@/�

我无法解释最后四个未定义的字符。我猜它与fgetc() 指针有关。我想在 EOF 停下来。

我到处找了,还是搞不懂。我还在学习 C 语言,所以我的目标是使用命令读取标准输入,它是一个 JSON 文件

$ test < file.json

然后使用 Jansson 提取和使用数据,但我的问题是使用该命令读取文件。

【问题讨论】:

  • 你从检查一个未初始化的变量开始,然后你不会因为 EOF 而停下来。您需要读取字符,如果它是 EOF,则停止,如果不是,则使用字符。你没有空终止你的缓冲区

标签: c fgetc


【解决方案1】:

你需要空终止你的字符串:

while (c != EOF) {
    c = fgetc(stdin);
    str[i]=c;
    i++;
}

str[i] = '\0';

是的,您应该先初始化c,然后再检查它是否为EOF

【讨论】:

  • 排序,主要是。您没有在循环之前初始化c,因此第一次迭代可能会退出而不读取任何内容。 while ((c = getchar()) != EOF)——或者为了与问题保持一致,while ((c = fgetc(stdin)) != EOF)——用于分配和控制循环是有原因的;它避免了未初始化变量的问题。该问题确实正确使用了int c;,这很好。
  • @Haskell-newb:如果你不初始化c,它可能在程序启动时有EOF的值——在这种情况下,你什么也读不到。
【解决方案2】:

三个问题:

  • %s 需要一个以 NUL 结尾的字符串,但您没有添加 NUL。
  • 在将值分配给 c 之前,您正在检查 c 的值。
  • 您的缓冲区只能容纳 1023 个字符加上一个 NUL,但您没有检查。

固定:

int main() {
   size_t len = 0;
   size_t size = 1024;
   char* str = malloc(size);

   while (1) {
      int c = fgetc(stdin);
      if (c == EOF)
         break;

      str[len++] = c;

      if (len == size) {
         size = (double)size * 1.2;
         str = realloc(str, size);
      }
   }

   str[len] = 0;

   ...

   free(str);
   return 0;
}

(不检查 mallocrealloc 错误。)

【讨论】:

  • 谢谢,我不需要 malloc,因为我知道我的 stdin 最多只能使用 300 个字符,而且这只是一个简单的问题,我的问题在于未定义的字符和变量 c ,我没有马上看到,但我明白为什么我需要分配它,谢谢你的回复
  • 使用 malloc 就像添加检查一样简单,而且更有用。 // 你错了。您的程序遇到了我提到的所有三个问题。您只是问了第一个,而另一个答案只涵盖了第一个,并为第二个提供了无意义的解决方案。
猜你喜欢
  • 2020-04-10
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2020-06-05
  • 2017-05-03
  • 1970-01-01
相关资源
最近更新 更多