windows 下的 EOF 值
Value of EOF under windows
我写了这段代码:
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF)
putchar(c);
return 0;
}
在windows下,我发现我必须输入ctrl+z才能停止程序,我还打印了EOF的值,它是-1。
但是,当我输入 -1 而不是 ctrl+z 时,程序继续执行,我想了解原因。谢谢!
作为文本输入 "-1"
不是 return 整数值 -1
而是两个字符,即 '-'
(对应于 ASCII 值 45
) 和一个 '1'
(对应于 ASCII 值 49
)。两者都不等于 EOF
(十进制为 -1
)。
根据定义,您不能输入被 getchar()
消耗为负值的内容,因为负值被定义为表示 "End-of-file"。
如果你想读入一个整数值(如-1
),使用scanf
:
int num;
if (scanf("%d", &num)==1) { // successfully read one valid integral value?
printf("you entered number %d:", num);
}
你需要稍微改变一下逻辑:
#include <stdio.h>
int main() {
int c;
int done = 0;
while (!done)
{
c = getchar();
if(c != '-')
putchar(c);
else
{
c = getchar();
if (c == '1')//this is an EOF
{
done = 1; // and probably putchar the EOF
}
else
{
putchar('-');
putchar(c);
}
}//else
}//while
return 0;
}
getchar()
函数returns 或者刚刚输入的字符的数值(被视为unsigned char
,所以它永远不会是负数),或特殊值EOF
表示没有更多的输入。
Windows 使用 Control-Z 触发和文件结束条件,这导致 getchar()
到 return 值 EOF
。但是 EOF
不是字符值;它被特别选择为一个不能是字符值的值。
文件结尾是一个条件,而不是一个值。 EOF
是数值,不是字符值;它是由 getchar()
编辑的 return 值,表示输入处于文件结束状态(或错误状态)。
(如果要读取整数值,无论是正数还是负数,都需要一次读取一个字符,然后计算该字符序列代表的整数值。整数值-1
可以是输入为字符 '-'
后跟字符 '1'
。C 有各种函数,如 atoi
和 *scanf
家族,可以进行这种转换。)
EOF 不是 'value'。它是由 stdio
库定义的哨兵。
Ctrl/z 是一个 keystroke,由终端驱动程序解释并导致它向从中读取的应用程序通知流结束,这导致 C read()
到 return 零,这导致 getchar()
到 return EOF。
Unix 上对应的击键,Linux,等等,是Ctrl/d。
我写了这段代码:
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF)
putchar(c);
return 0;
}
在windows下,我发现我必须输入ctrl+z才能停止程序,我还打印了EOF的值,它是-1。 但是,当我输入 -1 而不是 ctrl+z 时,程序继续执行,我想了解原因。谢谢!
作为文本输入 "-1"
不是 return 整数值 -1
而是两个字符,即 '-'
(对应于 ASCII 值 45
) 和一个 '1'
(对应于 ASCII 值 49
)。两者都不等于 EOF
(十进制为 -1
)。
根据定义,您不能输入被 getchar()
消耗为负值的内容,因为负值被定义为表示 "End-of-file"。
如果你想读入一个整数值(如-1
),使用scanf
:
int num;
if (scanf("%d", &num)==1) { // successfully read one valid integral value?
printf("you entered number %d:", num);
}
你需要稍微改变一下逻辑:
#include <stdio.h>
int main() {
int c;
int done = 0;
while (!done)
{
c = getchar();
if(c != '-')
putchar(c);
else
{
c = getchar();
if (c == '1')//this is an EOF
{
done = 1; // and probably putchar the EOF
}
else
{
putchar('-');
putchar(c);
}
}//else
}//while
return 0;
}
getchar()
函数returns 或者刚刚输入的字符的数值(被视为unsigned char
,所以它永远不会是负数),或特殊值EOF
表示没有更多的输入。
Windows 使用 Control-Z 触发和文件结束条件,这导致 getchar()
到 return 值 EOF
。但是 EOF
不是字符值;它被特别选择为一个不能是字符值的值。
文件结尾是一个条件,而不是一个值。 EOF
是数值,不是字符值;它是由 getchar()
编辑的 return 值,表示输入处于文件结束状态(或错误状态)。
(如果要读取整数值,无论是正数还是负数,都需要一次读取一个字符,然后计算该字符序列代表的整数值。整数值-1
可以是输入为字符 '-'
后跟字符 '1'
。C 有各种函数,如 atoi
和 *scanf
家族,可以进行这种转换。)
EOF 不是 'value'。它是由 stdio
库定义的哨兵。
Ctrl/z 是一个 keystroke,由终端驱动程序解释并导致它向从中读取的应用程序通知流结束,这导致 C read()
到 return 零,这导致 getchar()
到 return EOF。
Unix 上对应的击键,Linux,等等,是Ctrl/d。