如何从stdin读取-1 char?

时间:2015-04-25 23:57:49

标签: c stdin fgets fread

我真的很绝望,试图找出如何读取值为-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)。我尝试打开stdin作为二进制文件,但我发现posix系统将所有文件作为二进制文件。我正在使用QT,GCC和Ubuntu。我尝试了fread,read,fgets但我最终也是如此。简单地说,我需要读取我在stdin上输入的所有内容并将其放入char数组中,除非我输入控制字符(Ctrl + D)以结束读取。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

修改:正如@ TonyB的评论中所述,您不应将c声明为char,因为fgetc()会返回int },将其更改为int c;应该可以将EOF存储在c中。

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

原始答案:虽然问题已在评论中得到解决,但我添加了此答案的解决方案,我认为您感到困惑,EOF不是一个字符,它是一个特殊的某些I / O函数返回的值,表示流的结束。

你永远不应该认为它的值是-1,它通常是因为某个原因有一个宏,所以你应该总是依赖这些函数返回EOF而不是{{1 }}

由于值-1没有ascii表示,因此无法将其作为字符输入,但您可以解析输入字符串-1,并在需要时将其转换为数字

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