如何从标准输入读取-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()
.
我真的很想知道如何读取值为 -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()
.