getchar()函数解析

(一)Getchar()函数的作用是从缓存中读取一个字符。

Getchar()并不是直接从键盘读取数据,用户输入数据时,getchar()处于待命状态。这些数据会先被暂存于缓冲区,当用户输入“\n”,即按下回车键时,getchar()开始从缓冲区读取数据,只读取一个字符,getchar()可以读取“\n”。

【注意】回车“\r”与换行符“\n”的含义不同,回车的作用是将光标从当前位置移到本行开头,换行符的作用是将光标跳转到下一行。

(二)通过举例理解:使用通过getchar()与putchar()函数输入并输出多个字符。

【注意】putchar()函数的作用是输出参数中存储的一个字符,包括“\n”。

【解析】

1.定义一个字符型函数ch,初始值为0。

2.while循环体:

①当getchar()函数读取到EOF时,结束循环。

②在读取到EOF之前,getchar()每读取一个字符都会存放到变量ch中,并由putchar()函数输出。

【注意】

1.EOF(End Of File,文档的结束)其值为-1,即键盘键入ctrl+z。

2.循环的结束标志并不一定是EOF,可以是任意字符(只要能在键盘上敲出来)。

使用调试功能可以看到程序中变量值的变化:

 1.在进行第一次循环之后,ch中的值为“H”,打印出第一个字符“H”,说明getchar()函数已经从缓存中读取到第一个字符。

 2.进行第二次循环后,getchar()函数在缓存中读取到字符“e”,并将其存储到变量ch中,putchar()函数打印出第二个字符“e”。

 3.当输出完全部字符后,getchar()函数会读取’\n’字符并将其存储到变量ch中,由putchar()函数打印出来,具体表现就是光标换行。

 4.键入ctrl+z以结束循环。如下图所示,调试箭头指向第9行return 0,已经跳出循环。

 5.如果不结束程序,用户可以继续输入,每个“\n”作为一次读取的提示,getchar()函数会循环读取包括这个“\n”和它之前的所有字符,并输出。以此类推,直到用户输入循环结束条件ctrl+z。

 

(三)getchar()函数的一个应用,弥补scanf()存在的问题

假设一种情况,先用scanf()接收一个字符串,再用getchar()接收一个字符,然后分两行打印:

 

此时程序出现问题:在输入字符串后,程序没有给用户输入字符的机会就直接输出了字符串。其原因在于,当用户按下回车键,scanf()函数接到“\n”作为信号开始接收完全部字符串后,它并不会接收“\n”本身,该字符仍留在缓存中。而getchar()函数会紧接着接收“\n”,此时对函数来说,输入环节已经全部结束,它会直接输出字符串与“\n”。这与程序原本的目的是不相符的。

解决方案:利用getchar()函数的特性,给出额外的getchar()用于接收多余的“\n”:

 由此可以扩展出getchar()函数的新用法:清理缓冲区中多余的字符。

 程序会使用getchar()函数不断读取缓冲区中的字符到tmp中,直到缓冲区中没有字符为止。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐