printf正常但sprintf传入格式字符串作参数时输出异常问题咨询
为什么 sprintf 后用 printf(r) 输出不符合预期?
这个问题的核心其实是一个容易忽略的细节:你最后调用的 printf(r) 是把 r 的内容当作格式字符串来处理,而不是普通字符串!
咱们一步步拆解:
先看直接用
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,完全符合预期。
- 第一个
再看
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
相关产品推荐
相关产品推荐

