我写过以下C应用程序:
#include <stdio.h>
struct Book {
int a;
int b;
};
int main() {
struct Book book;
book.a = 10;
book.b = 20;
printf("The value set for struct a " + book.a);
return 0;
}
我在+
内使用了printf
,期望它会连接字符串,但是它会修剪第一个10
字符并输出如下输出,我知道我应该使用{{1}并传递%d
作为第二个参数,,但为什么book.a
正在修剪我的字符串?
printf
答案 0 :(得分:2)
某些上下文中的字符串常量会衰减为指向第一个元素的指针,这就是这里发生的事情。然后,当您向指针添加一个整数值时,它会将指针递增许多(在char *
)个字节的情况下。
由于book.a
为10,因此您将指针的值加10。所以你现在有一个指向字符串中第10个元素的指针。这就是printf
收到的内容,也就是它从哪里开始打印。
"The value set for struct a"
^--- 10th character
答案 1 :(得分:1)
C中没有内置字符串,更不用说字符串运算符了。以空值终止的字符串文字是字符串支持在语言级别结束的地方;其他一切都在标准库中完成。
运算符+
将数字10添加到指针的值,您的字符串文字将转换为该值。这会生成一个指向字符串中间的指针,这是在应用%s
格式说明符后打印的内容。
基本上,这个表达
"The value set for struct a " + book.a
与此代码完全相同:
char prtStr[] = "The value set for struct a ";
char *ptrMid = &ptrStr[book.a];
printf("%s", ptrMid);
如果您想在字符串后打印10
,请使用%d
,如下所示:
printf("The value set for struct a %d", book.a);
答案 2 :(得分:1)
字符串"The value set for struct a "
表示为指向内存的指针,该内存包含以null结尾的字符数组。通过向其添加book.a
(10),您引用了缓冲区的第十个元素,即"s"
。你需要的是:
printf("The value set for struct a %d", book.a);