为什么使用" +"会对字符串进行修剪? printf中的opeartor

时间:2017-01-28 03:31:40

标签: c

我写过以下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

3 个答案:

答案 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);