首页 > 其他分享 >“悬空else” 和 “清空缓冲区”

“悬空else” 和 “清空缓冲区”

时间:2023-01-10 17:32:52浏览次数:36  
标签:读取 打印 else 清空 缓冲区 getchar

1.分支语句if else中的 “悬空else”

我们先来看一个代码:

“悬空else” 和 “清空缓冲区”_while循环

光看这个代码,可能很多人会认为打印的是haha,但是其实结果是什么都不打印;

我在vs2022上打了这段代码:

“悬空else” 和 “清空缓冲区”_while循环_02

发现else自动对齐了里面的if;事实上,else就是和它离得最近的if匹配的,悬空else其实还是由于书写习惯不好引起的;

如果要和第一个代码表达的意思一样,改正如下:

“悬空else” 和 “清空缓冲区”_while循环_03

由此可见,培养好的代码书写习惯很重要!


2.清空缓冲区

2.1 getchar 和 putchar

getchar : 读取一个字符,返回的是字符的ASCII码值;读取失败,返回EOF(-1),调试后按Ctrl+z停止读取;

putchar : 打印一个字符;

“悬空else” 和 “清空缓冲区”_代码表_04“悬空else” 和 “清空缓冲区”_代码表_05


2.2清空缓冲区

“悬空else” 和 “清空缓冲区”_while循环_06

这里输入ABCDEF,回车后直接打印了“确认失败”;

出错的原因:scanf接收了缓冲区的ABCDEF,但是不接收回车("\n"),这就导致getchar接收的是\n,不等于Y,所以打印了“确认失败”;

所以我们要清空缓存区,在scanf 后面加上getchar():

“悬空else” 和 “清空缓冲区”_缓存_07

但是,当输入123456 abc,又失败了:

“悬空else” 和 “清空缓冲区”_缓存_08

这里 scanf 默认读取到空格就停止,于是getchar清掉了空格,下面的getchar读了a,不等于Y,所以确认失败;


于是,我们用while循环,当getchar读到(过了)\n ,就停止:

“悬空else” 和 “清空缓冲区”_代码表_09

“悬空else” 和 “清空缓冲区”_缓存_10

调试后正常,也就达到了清理缓冲区的效果




标签:读取,打印,else,清空,缓冲区,getchar
From: https://blog.51cto.com/u_15928027/6000497

相关文章