使用fgetc()读取文件后字符串中的未定义字符

时间:2018-03-19 05:53:03

标签: c fgetc

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

#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语言,所以我的目标是使用命令读取stdin是一个JSON文件

$ test < file.json

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

2 个答案:

答案 0 :(得分:3)

您需要空字符串终止字符串:

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

str[i] = '\0';

是的,您应该在检查c之前初始化EOF

答案 1 :(得分:1)

三个问题:

  • %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错误。)