执行功能:
printf("%s\n", "123456789" + 3); //output: "456789"
为什么输出此结果? 同样,如果我想输出“ 123”怎么办? 现在我很困惑。救救我。
答案 0 :(得分:7)
printf()传递了一个指向以3递增的字符串常量的指针
printf("%s\n", "123456789" + 3);
printf()接受格式字符串参数,后跟可变参数集。在这种情况下,“%s”是格式字符串中的第一个(也是唯一的)变量。
可变参数部分的格式字符串后面只有一个参数:字符串常量:“ 12345678”,解析为指向'1'字符的指针;但是,由于“ + 3”,该指针增加了3。这会将指针3的位置移至“ 4”。
然后,printf打印以'4'开头的字符串。由于字符串常量在'9'之后以'\ 0'字符终止,所以printf打印“ 456789”
打印字符串的前3个字符
要仅打印字符串的前3个字符,请在printf格式字符串中使用%.3s
:
printf("%.3s\n", "123456789");
答案 1 :(得分:1)
基本上,字符串是字符数组,这意味着它们的名称(变量名)指向数组中的第一个元素。 例如,在数组a [] = {3,4,5}中,a [0]显然为3。 但是,a本身的值也为3(例如printf(“%d”,* a);) 如果您增加自身,则将增加a的地址,因此a +1的值为4。 隐式声明一个字符数组(对字符串所做的操作)仍然需要程序为其提供某种形式的地址(即,“ 123456789”中的1所在的位置) 就是说,增加字符串本身基本上与增加数组名称相同,因此“ 123456789” + 3将给出与“ 456789”关联的地址。 因此,printf基本上看到的是“ print 456789”。
我怀疑我是否能够尽可能简单地解释这一点,或者甚至您也可以理解,但是我尝试了。
祝你好运!
答案 2 :(得分:1)
一个人不能添加字符串(“ 123456789”)和数字(3)。 你想要什么? a)整数加法还是字符串串联?
a) 123456789 + 3
b) "123456789" + "3"
编译器不会猜测您想要哪个选项!
因此,需要使用( unsafe )atoi()
等功能将其中一个参数转换为另一个参数的类型。
答案 3 :(得分:1)
"123456789"
是字符串文字。它是C语言中char [10]
类型的对象。它是数组类型的对象。
当数组类型的对象与二进制+
运算符一起使用时,它将隐式转换(衰减)为指针类型。结果指针值指向数组的开头。因此,原始的char [10]
数组会衰减为char *
,指向'1'
中的字符"123456789"
。
二进制运算符+
应用于指针时,将执行指针算术。将3
添加到char *
指针会产生一个指向原始指针右边3个字节的指针。因此,您将获得一个指向'4'
中字符"123456789"
的指针。
之后,您使用格式%s
要求询问printf
打印从该'4'
开始的字符串。这就是您得到的输出。
在C ++中也发生了同样的事情,除了在C ++中,此字符串文字具有const char [10]
类型并衰减为const char *
指针,