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

Undefined characters in string after reading file with fgetc()

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

#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 提取和使用数据,但我的问题是使用该命令读取文件。

您需要 null-terminate 您的字符串 :

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

str[i] = '[=10=]';

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

三个问题:

  • %s 需要一个 NUL-terminated 字符串,但您没有添加 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 错误。)