使用“%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
数据,这是错误的,未定义行为的来源在其他答案。
我正在打印一个 字符串常量 定义为 预处理器指令 使用 %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
数据,这是错误的,未定义行为的来源在其他答案。