为何scanf使用%c格式符可接收多个字符?而非仅读取单个字符
为什么
scanf("%c")能接收多个字符? 你没记错——%c格式符本身只能单次读取一个字符,这段代码能接收多个字符的关键,是把scanf("%c", &ch)放在了do-while循环里,通过**反复调用scanf**来逐个读取输入流里的字符,直到遇到分号;才终止循环。
具体逻辑拆解:
- 每次循环执行
scanf("%c", &ch)时,会从标准输入流中读取下一个字符(包括空格、换行这类空白字符,这也是它和%s的重要区别:%s会跳过开头空白,且遇到空白就停止读取)。 - 读取后判断字符是否为
;,如果是就跳出循环;否则处理当前字符(计算差值、统计类型),然后进入下一次循环,再次调用scanf读取下一个字符。 - 整个循环过程相当于把“单次读一个字符”的操作重复了N次,最终实现了接收任意数量字符的效果。
和%s的区别:
%s是一次性将连续的非空白字符读取到字符数组中,自动添加字符串结束符\0,但无法读取包含空白的内容,也不会逐个处理每个字符。- 这段代码用
%c+循环的方式,能逐个处理每个输入字符(包括空白),更适合需要对每个字符单独做统计或计算的场景。
代码里的验证:
看main函数的核心循环逻辑:
do { scanf("%c", &ch); // 每次循环读一个字符 if (ch == ';') { break; } // 处理当前字符的统计、计算逻辑 } while (ch != ';');
每一轮循环都会触发一次scanf读入一个字符,循环持续到读到;为止,自然就能接收多个字符了。
内容的提问来源于stack exchange,提问作者Razi Al Ashhab
相关产品推荐
相关产品推荐

