复习《字符输入/输出和输入确认》的一点总结
本文总结来自C Primer Plus第五版第八章[字符输入/输出和输入确认]特别鸣谢@ehszt@书生牛犊@liululu001还有其他给我回帖提供帮助的大神~
在我目前所编译的大部分程序中,在链接器上输入字符,并且在按下回车键前什么也不会发生。
为什么一定要按下回车键才会出现回显呢?
原因在于系统将程序员输入的字符收集并存储在一个被称为缓冲区的临时存储区域中。按下回车键,便可使键入的字符块对正在等待的程序变为可用。
那么为什么需要缓冲区呢?
原因在于,首先,将若干字符作为一个块传输比逐个发送这些字符耗费的时间少。其次,如果输入有误,就可以使用键盘来更正功能来修正错误。因此,当最终按下回车键时,就可以发送你想要的输入了。
计算机操作系统需要某种方式来断定每个文件起始和结束的位置。而检测文件结尾的一种方法是在文件中防治一个特殊字符来标志结尾。C的处理方法是让getchar()函数在到达文件结尾时返回一个特殊值,而不去管操作系统时如何检测文件结尾的。赋予该值的名称是EOF(End Of File)。scanf()函数在监测到文件结尾时也返回EOF。(EOF的含义如前面的英文释义所示,表示文件的结尾。因此在实际程序编译中,需要读取一串字符到某个字符停止,则该值赋予EOF,如getchar() != ‘q’,此处字符q表示读取到q字符的时候便停止读取,进入程序的下一部分)
输入流和数值
考虑如下所示的一行输入:
is 28 12.4
一般人看到这行会认为该输入是一串字符后面跟着一个整数,然后是一个浮点值。燃鹅,对于程序猿来说(憋瞅瞅,说的就是你),该输入是一个字节流。第一个字节是字母i的i 符编码,第二个字节是字母s的字符编码,第三个字节是空格字符的字符编码,第四个字节是数字2的字符编码,等。在读取输入的时候要非常注意输入的空白字符(空格字符,制表符及换行符)。
下面是几个常用的简易模块函数,分享一下
get_int()函数主要是在主函数里读取正确的整数,剔除错误输入用的
get_int()
{
int put;
char chl
while(scanf("%d", &input) != 1)
{
while((ch = getchar() != '\n')
putchar(ch);//剔除错误输入
printf(" is not an integer.\nPlease enter an ");
}
return input;
}
get_first()函数是用来读取字符串中的第一个字符并剔除掉剩余的字符
char get_first(void)
{
int ch;
ch = getchar();
while(getchar() != '\n')
continue;//这一步很关键!剔除输入流里的剩余字符!
return ch;
}