使用“%c%c...”格式说明符打印字符串会产生不稳定的结果。为什么会这样?

Using " %c%c..." format specifier to print a string produces erratic results. Why is it so?

我正在打印一个 字符串常量 定义为 预处理器指令 使用 %s 格式说明符和 printf() 产生正确的结果.

但是,然后我尝试了一些实验,看看如果我改为使用“%c”和“%c%c”和“%c%c%c..”等作为格式说明符会发生什么打印字符串常量。

我无法解释我得到的结果。

代码:

#include<stdio.h>
#define test "HeyYou!"
main()
{
   printf("\n %s", test );
   printf("\n %c", test);
   printf("\n %c%", test);  
   printf("\n %c%c%c%", test);
   printf("\n %c%c%c%c", test);
   printf("\n %c%c%c%c%c", test);
   printf("\n %c%c%c%c%c%c", test);
 }

输出:

HeyYou!      /*<-- Desired Output and can be explained*/

             /*<---- But, I am not able to explain these outputs below*/
@`    
@`á
@`áΦ
@`áΦ

问题是您没有完全理解:%s 需要一个指向字符串(以 [=13=] 字符结尾)的指针,而 %c 需要要作为参数传递的实际单个字符。传递字符串文字时,您实际上传递了一个指向字符序列的指针,当您在其中获得 [=13=] 字符时 printf 搜索字符串的末尾,而当您使用 %c 你传递字符本身(每个字符在一个不同的参数中)并且 printf 只打印一个字符。

所以要获得相同的结果,您可以使用:

printf("%s", test);

printf("%c%c%c%c%c", test[0], test[1], test[2], test[3], test[4]);

(最后一个例子也会打印 [=13=],在它后面,以防它恰好在 test[5] 之前)

您的代码中的问题是您在需要字符的地方传递了一个指针,因此指针被解释为 char 数据,这是错误的,未定义行为的来源在其他答案。