提问人:うちわ 密か 提问时间:10/3/2017 最后编辑:gsamarasうちわ 密か 更新时间:10/3/2017 访问量:2273
窗口下的 EOF 值
Value of EOF under windows
问:
我写了这个代码:
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF)
putchar(c);
return 0;
}
在窗口下,我发现我必须输入 ctrl+z 才能停止程序,我还打印了 EOF 的值,它是 -1。 但是,当我输入 -1 而不是 ctrl+z 时,程序会继续执行,我想了解原因。谢谢!
答:
输入为文本不会返回整数值,而是返回两个字符,即 a(对应于 ASCII 值)和 a(对应于 ASCII 值)。两者不等于(以十进制表示)。"-1"
-1
'-'
45
'1'
49
EOF
-1
根据定义,您不能输入作为负值使用的内容,因为负值被定义为表示“文件结束”。getchar()
如果要读取整数值(如),请使用:-1
scanf
int num;
if (scanf("%d", &num)==1) { // successfully read one valid integral value?
printf("you entered number %d:", num);
}
评论
ReadFile
ReadConsole
您需要稍微更改一下逻辑:
#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;
}
评论
-1
int
EOF
getchar
int
char
该函数返回刚刚输入的字符的数值(被视为 ,因此它永远不会为负数),或者返回指示不再输入的特殊值。getchar()
unsigned char
EOF
Windows 使用 Control-Z 来触发文件结束条件,这会导致返回值 。但不是字符值;它被专门选择为不能是字符值的值。getchar()
EOF
EOF
文件末尾是一个条件,而不是一个值。 是数值,但不是字符值;它是返回的值,用于指示输入处于文件结束状态(或错误条件)。EOF
getchar()
(如果要读取整数值(正数或负数),则需要一次读取单个字符,然后计算字符序列表示的整数值。整数值可以作为字符输入,后跟字符 。C 具有各种函数,例如 和 family,可以进行这种转换。-1
'-'
'1'
atoi
*scanf
评论
EOF 不是一个“值”。它是由库定义的哨兵。stdio
Ctrl/z 是击键,它由终端驱动程序解释,并导致它通知流的结束给从中读取的应用程序,这会导致 C 返回零,从而导致返回 EOF。read()
getchar()
Unix、Linux 等对应的击键是 Ctrl/d。
评论
'-'
'1'
atoi()
atof()
libmath