我写了这段代码:
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF)
putchar(c);
return 0;
}
在Windows下,我发现我必须输入ctrl + z才能停止程序,我还打印了EOF的值并且它是-1。 但是,当我输入-1而不是ctrl + z时,程序继续执行,我想了解原因。谢谢!
答案 0 :(得分:3)
输入"-1"
作为文本不会返回整数值-1
,而是返回两个字符,即'-'
(对应于ASCII值45
)和{{1 (对应于ASCII值'1'
)。两者都不等于49
(十进制为EOF
)。
根据定义,您不能输入被-1
作为负值消费的内容,因为负值被定义为代表&#34;文件结束&#34;。
如果您想要读取整数值(例如getchar()
),请使用-1
:
scanf
答案 1 :(得分:1)
当我输入-1而不是ctrl + z时,程序继续执行,我想了解原因
因为&#34; -1&#34;被解释为&#39; - &#39;和&#39; 1&#39;,而不是紧凑的输入。这就是为什么你无法用你的代码捕获它。
答案 2 :(得分:1)
getchar()
函数返回 刚刚输入的字符的数值(被视为unsigned char
,因此它永远不会为负),或< / em>特殊值EOF
,表示没有更多输入。
Windows使用Control-Z触发和结束文件条件,这会导致getchar()
返回值EOF
。但EOF
不是字符值;它被特别选择为一个不能成为字符值的值。
文件结束是条件,而不是值。 EOF
是数值,但不是字符值;它是getchar()
返回的值,表示输入处于文件结束条件(或错误条件)。
(如果要读取整数值,正数或负数,则需要一次读取一个字符,然后计算字符序列所代表的整数值。整数值-1
可以输入为字符'-'
后跟字符'1'
。C具有各种功能,例如atoi
和*scanf
系列,可以进行转换。)
答案 3 :(得分:0)
EOF不是一个“价值”&#39;。它是由(fac 5)
=> 120
库定义的哨兵。
Ctrl / z是一个击键,它由终端驱动程序解释,并使其通知从应用程序读取的流的结束,这导致C stdio
返回零,导致read()
返回EOF。
Unix,Linux等上的相应按键是Ctrl / d。
答案 4 :(得分:-1)
您需要稍微更改一下逻辑:
array ( 0 => 21, 4 => 76, 7 => 85, 8 => 55, )
}