You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:47:39