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

printf正常但sprintf传入格式字符串作参数时输出异常问题咨询

为什么 sprintf 后用 printf(r) 输出不符合预期?

这个问题的核心其实是一个容易忽略的细节:你最后调用的 printf(r) 是把 r 的内容当作格式字符串来处理,而不是普通字符串!

咱们一步步拆解:

  1. 先看直接用 printf 的情况:
    printf(c, 65, c, 66) 里,c 是格式字符串 "%c %s %c",参数完全匹配:

    • 第一个 %c 替换为 ASCII 65 对应的 A
    • %s 替换为 c 指向的字符串本身,也就是 "%c %s %c"
    • 最后一个 %c 替换为 ASCII 66 对应的 B
      所以输出 A %c %s %c B,完全符合预期。
  2. 再看 sprintf 的流程:
    sprintf(r, c, 65, c, 66) 确实会把正确的内容写入 r —— 也就是 A %c %s %c B。但问题出在你接下来的操作:printf(r)。
    这里的 r 被当作了 printf 的格式字符串参数,而不是普通输出内容。此时 r 里的 %c、%s 会被 printf 当作格式控制符解析,但你没有给 printf 传递对应的参数,这属于格式字符串与参数不匹配的未定义行为。
    在你的运行环境中,这种未定义行为刚好表现为这些多余的格式符被“跳过”,所以最终只输出了 A B。

解决方法

如果要正确输出 r 里的内容,你需要明确告诉 printf 这是一个普通字符串,用以下两种方式之一:

printf("%s", r); // 用 %s 格式符输出字符串
// 或者
puts(r); // puts 专门用于输出普通字符串

这样就能得到和直接 printf 一样的结果:A %c %s %c B。

内容的提问来源于stack exchange,提问作者mdatsev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:59:00