繁体   English   中英

为什么是printf(“%s \\ n”,“123456789”+ 3); //输出:“456789”

[英]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"

编译器不会猜测你想要哪个选项! 所以,其中一个参数需要转换为另一个的类型,使用一些函数,如( unsafeatoi()等...

"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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM