我正在阅读K&R的书,想要以我从未尝试过的方式测试printf()和putchar()函数。我遇到了几个意外事件,并希望听到更有经验的程序员为什么会这样。
char c;
while((c = getchar()) != EOF) {
//put char(c);
printf("%d your character was.
", c);
}
如何在输入流(getchar()或scanf()函数中获得EOF(文件结尾))? getchar()/ scanf()函数无法识别的意外密钥可以生成它吗?
在我的书中,它说c必须是一个整数,因为它需要存储EOF并且变量必须足够大以容纳EOF可以容纳的任何可能的char。这对我来说没有意义,因为EOF是一个值为-1的常量整数,偶数char可以存储。任何人都可以澄清这是什么意思吗?
当我向putchar()函数发送"hello"或"hello"时会发生什么?它期望获得一个整数,但如果我发送后一个字符串或char序列,则返回奇怪的输出,例如EE或oo。
为什么当我使用上面写的printf()函数时,我得到两个输出?一个是我输入的,另一个是整数,在ASCII中是行尾。它是否产生第二个输出,因为我按下回车键,它假定它是第二个字符?
谢谢。
EOF通常为"-1",当终端的read()返回0时,getchar()返回它。您不能将char用于getchar,因为那时打印代码为255的字符(例如,在KOI8-R中'''你会得到一个错误的EOF。要隐藏输入字符,您应该正确设置终端(关闭回声)。
通过说假EOF,你的意思是这个字符是一个大于1个字节的整数,如果变量的范围设置为大于1个字节,可以被getchar()识别吗?
'hello'不是有效字符串,可能导致未定义的行为。 ''之间的东西必须只代表一个字符。
通过说"假EOF"我的意思是你输入一个角色,但你的应用程序会认为那是EOF。任何字母== unsigned char,因此,您需要至少2个字节才能发送EOF!
我同意任何字母都是unsigned char,但char的范围也是负数。如果它是-1,EOF如何需要2个字节?一个人输入什么字符才能使应用程序认为它是EOF?
如果您当前的代码页是1252(大多数西方文化中的默认代码页),则键入(LATIN SMALL LETTER Y WITH DIAERESIS,其代码页中的值为255)将导致这样的假EOF。因为(signed char)255 == (signed char)-1是真的。
getchar()将返回任何可能的char,这意味着0到255之间的任何值(如果是无符号的)。但是如果出现错误,则需要提供错误代码,因此getchar()必须返回至少257个不同的值,char是一种无法区分超过256个值的类型。所以你需要更广泛的类型。由于历史原因,short不合适(不确定长度超过一个字节),然后选择int(确定足够长)。因此,技术上getchar()在读取真实字符时返回0-255,在出现错误时返回-1。您必须区分-1和255。
在Linux上,您可以使用Ctrl + d发送它
你需要一个int,否则你无法区分EOF和最后一个可能的字符(0xFFFF与0x00FF不同)
putchar想要一个字符,而不是一个字符串,如果你试图给它一个字符串,它会打印一个字符串地址的一部分
你只得到一个输出:你输入的字符的ascii值,另一个"输入"是你在终端输入的内容
编辑 - 有关2的更多详细信息
你需要一个int,因为getchar可以返回值为-1(0x00FF)的字符和值为-1的整数(0xFFFF),它们的含义不同:值-1的字符是有效字符(例如,它是在latin-1中的?而在此上下文中,值-1的整数是EOF。
这是一个显示差异的简单程序:
#include
int main(int argc, char ** argv) {
{
char c = 0xFF; /* this is a valid char */
if (c == EOF) printf("wrong end of file detection
");
}
{
int c = 0xFF; /* this is a valid char */
if (c == EOF) printf("wrong end of file detection
");
}
}
第一次测试成功,因为char为0xFF == -1,而第二次测试失败,因为int为0x00FF!= -1。
我希望这会让它更清晰一些。
在Windows上,EOF是Ctrl + Z.
谢谢。 我想更多解释第二点。 你的意思是有大于0x00FF(1字节)的字符,如果我们使用char,它无法识别这些字符?
我编辑发布试图让它更清楚......
@decas,当使用char函数时,没有大于0x000000FF的字符,除了EOF在32位平台上为0xFFFFFFFF。 问题来自于(char)0x000000FF和(char)0xFFFFFFFF具有相同的值:0xFF alias -1。
您必须关闭输入流才能获得EOF。通常在UNIX中使用CTRL-D,但是看到你tty config(stty -a)
已经回答了
相同
你的tty回应你默认键入的内容。如果您不想这样,请将其设置为noecho模式(stty -echo)。一些炮弹再次让它回响起来。试着用sh。您必须知道taht tty还会缓冲输入,直到RETURN类型为止(如果需要,请参阅原始模式的stty手册)。