scanf用%c处理短语输入的疑问——基于《C Primer Plus》习题
为什么
scanf("%c")配合循环会输出多个字符? 嘿,这个问题刚好戳中了很多C语言初学者对scanf和输入机制理解的盲区,我来给你一步步拆解清楚!
核心误区:你忽略了循环的作用+输入缓冲区的存在
首先明确两个关键事实:
scanf("%c", &ch)确实每次只读取一个字符,但它读的是输入缓冲区里的字符,而不是直接从键盘实时读取。- 你的程序里有一个
while循环,它会反复执行「读字符→判断是否为'g'→不是就输出→再读下一个字符」的逻辑,直到碰到'g'才停止。
程序执行的完整流程(结合你的输入)
当你输入Go west, young man!并按下回车时,所有字符(包括空格、逗号,直到回车)都会被系统存入输入缓冲区。程序的执行步骤是:
- 第一次
scanf("%c", &ch):从缓冲区取出第一个字符'G',存入ch。此时ch != 'g',执行printf("%c", ch)输出G,然后再次调用scanf读取下一个字符。 - 接下来的每一次循环:依次从缓冲区读取下一个字符(
'o'、空格、'w'、'e'、's'、't'、','、空格、'y'、'o'、'u'、'n'),每读一个就判断是否为'g'——显然都不是,所以逐个输出。 - 当
scanf读到'g'(也就是young里的那个g)时,ch == 'g',循环条件不成立,循环终止,程序结束。
这就是为什么你会得到输出Go west, youn,而不是只输出G——循环让程序反复读取了缓冲区里的多个字符,直到触发终止条件。
解答你的几个具体疑问
- 为什么用
%c却能处理整行内容?:不是%c能处理整行,是循环让程序反复调用scanf("%c"),逐个从输入缓冲区里取出字符。输入缓冲区会暂时保存你输入的所有内容,直到程序把它们读完。 scanf会自动将输入存储为数组吗?:完全不会!scanf("%c")每次只把单个字符存入ch这个单个字符变量里。输入缓冲区是系统维护的临时存储区域,不是你程序里的数组。- 原以为只会输出
G?:这是因为你没注意到while循环的作用——程序不是只执行一次读和输出,而是会循环执行,直到碰到'g'才停下。
举个简单的验证例子:如果你的输入是Gg,程序会输出G,然后下一次scanf读到'g',循环终止,最终输出就是G;如果输入是abcgdef,输出就是abc,你可以自己试试~
内容的提问来源于stack exchange,提问作者igroglaz
相关产品推荐
相关产品推荐

