c语言putchar和printf一起用,关于输入:C:printf()和putchar()问题

我正在阅读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手册)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值