[英]Why printf(“%s\n”, “123456789” + 3); //output: “456789”
执行功能:
printf("%s\n", "123456789" + 3); //output: "456789"
为什么输出这个结果? 同样,如果我想输出“123”,我该怎么办? 现在我很困惑。 帮我。
printf()传递一个指向字符串常量的指针,增量为3
printf("%s\n", "123456789" + 3);
printf()接受一个格式字符串参数,后跟一个可变参数集。 在这种情况下,'%s'是格式字符串中的第一个(也是唯一的)变量。
在格式字符串后面的可变参数部分中只有一个参数:字符串常量:“12345678”,它解析为指向“1”字符的指针; 但是,由于“+ 3”,指针增加3。 这将指针3的位置移动到'4'。
然后,printf打印从'4'开始的字符串。 由于字符串常量在'9'后面以'\\ 0'字符终止,printf打印“456789”
打印字符串的前3个字符要仅打印sting的前3个字符, %.3s
在printf格式字符串中使用%.3s
:
printf("%.3s\n", "123456789");
基本上,字符串是字符数组,这意味着它们的名称(变量名称)指向数组中的第一个元素。 例如,在数组a [] = {3,4,5}中,a [0]显然是3.但是,a本身的值也是3(就像printf(“%d”,* a);)如果你增加一个自己,你正在递增a的地址 ,所以a + 1的值将是4.隐式声明一个字符数组(你用字符串做了什么)仍然需要程序给它一些形式的地址(也就是说,“123456789”中的1所在的位置)也就是说,递增字符串本身基本上与递增数组名称相同,因此“123456789”+ 3将给出与“456789”相关联的地址。 那么printf基本上看到的是“print 456789”。
我怀疑我能够尽可能简单地解释这一点,或者如果你甚至可以遵循这一点,但我试过了。
祝你好运!
一个人不能添加字符串(“123456789”)和数字(3)。 你想要什么? a)整数加法或字符串连接?
a) 123456789 + 3
b) "123456789" + "3"
编译器不会猜测你想要哪个选项! 所以,其中一个参数需要转换为另一个的类型,使用一些函数,如( unsafe ) atoi()
等...
"123456789"
是一个字符串文字 。 它是C中char [10]
类型的对象。它是数组类型的对象。
当数组类型的对象与binary +
运算符一起使用时,它会被隐式转换(衰减)为指针类型。 结果指针值指向数组的开头。 因此,原始的char [10]
数组衰减为char *
指向"123456789"
字符'1'
"123456789"
。
二进制运算符+
,当应用于指针时,执行指针运算 。 将3
添加到char *
指针会产生一个指针,该指针指向原始指针右侧的3个字节。 所以,你得到一个指向"123456789"
字符'4'
的指针。
之后,您使用格式%s
来询问printf
以打印从'4'
开始的字符串。 这就是你得到的输出。
同样的事情发生在C ++中,除了在C ++中这个字符串文字具有const char [10]
类型并衰减为const char *
指针,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.