我尝试编写一个简单的代码,以便读取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提取和使用数据,但我的问题是使用该命令读取文件。
答案 0 :(得分:3)
您需要空字符串终止字符串:
while (c != EOF) {
c = fgetc(stdin);
str[i]=c;
i++;
}
str[i] = '\0';
是的,您应该在检查c
之前初始化EOF
。
答案 1 :(得分:1)
三个问题:
%s
期望以NUL结尾的字符串,但您没有添加NUL。c
分配值之前,您正在检查c
的值。修正:
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;
}
(不检查malloc
和realloc
错误。)