如何从标准输入读取-1 字符?

How to read -1 char from stdin?

我真的很想知道如何读取值为 -1/255 的 char,因为对于大多数函数来说,这意味着 EOF。例如,如果我输入扩展 ASCII 中的所有字符,从低到高(十进制值),我最终得到 -1/255,这是 EOF,所以我不会将它放入数组。我创建了小代码来表达我的问题。

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

#define BUFFERSIZE 1024

int main(void){
char c;
unsigned int *array = (unsigned int*)calloc(BUFFERSIZE,sizeof(unsigned int)), i = 0;
while (1){
    c = fgetc(stdin);
    if (c == EOF)
        break;
    array[i] = c;
    i++;
}
array[i] = 0;
unsigned char *string = (unsigned char *)malloc(i);
for(int j = 0;j < i;j++)
   string[j] = array[j];
free(array);

//working with "string"

return 0;
}

我可以模式

if (c == EOF)
   break; 

像这样

c = fgetc(stdin);
array[i] = c;
i++;
if (c == EOF)
   break;

当然,程序也会读取用户从键盘输入的控制字符(例如 Ctrl+D - Linux)。我尝试以二进制形式打开标准输入,但我发现 posix 系统将所有文件作为二进制文件。我正在使用 QT、GCC 和 Ubuntu。我尝试了 fread、read、fgets,但结果还是一样。简单地说,我需要读取我在 stdin 上输入的所有内容并将其放入 char 数组,除非我输入控制字符 (Ctrl+D) 以结束读取。任何建议表示赞赏。

编辑:如@TonyB 的评论所述,您不应将 c 声明为 char,因为 fgetc() returns int,因此将其更改为 int c; 应该可以将 EOF 存储在 c.

我没看到你将 c 声明为 char c; 所以所有功劳归于@TonyB.

原答案:虽然问题在评论中得到了解决,并且我在这个答案中添加了解决方案,但我想你很困惑,EOF不是字符,它是一个特殊值 return 由某些 I/O 函数编辑以指示流的结尾。

你永远不应该假设它的值是 -1,它经常是但是有一个宏是有原因的,所以你应该始终依赖这些函数 return EOF 不是 -1.

由于值 -1 没有 ascii 表示,因此您不能将其作为字符输入,但是您可以解析输入字符串 {'-', '1', '[=24=]'},并将其转换为数字,如果您需要。

另外,Do not cast the return value of malloc().