为什么“ \”会影响printf的返回值?

时间:2020-01-30 15:42:38

标签: c printf

参考给出的答案here,必须从以下代码中得到什么输出:

#include<stdio.h>

int main()
{
    int a=65;
    printf("%d\n",printf("%d\
    \n",a));
    return 0;
}

它给出输出:

65
4

但是在我看来,它应该给这个:

65
3

为什么输出65 4

3 个答案:

答案 0 :(得分:9)

您要打印4个字符<tab>\n65,因此您得到的结果很有意义。

请注意,此\行结尾处的printf("%d\n",printf("%d\将格式化格式字符串中下一行的所有缩进。运行文件时,该缩进最初是<tab>字符。

有人报告65 7的输出是因为StackOverflow将粘贴代码中的所有制表符更改为4个空格,因此他们从问题中复制的代码与您在计算机上运行的代码不同

请参见此演示,该演示显示了输出online version<tab>的存在:

#include<stdio.h>

int main()
{
    int a=65;
    printf("%d\n",printf("%d\
    <--tab here\n",a));
    return 0;
}

输出:

65 <--tab here
15

如果您删除了奇怪的,完全不必要的并且显然容易出错的行继续,它将很好地打印预期的输出:

#include<stdio.h>

int main()
{
    int a=65;
    printf("%d\n",printf("%d\n",a));
    return 0;
}

输出:

65
3

答案 1 :(得分:6)

由于\会将下一行的缩进字符(制表符,空格)作为字符串的一部分。要在不同行上连接字符串,只需将每个部分用双引号引起来:

#include<stdio.h>
int main()
{
    int a=65;
    printf("%d\n",printf("%d"
    "\n",a));
    return 0;
}

作为一般说明-行\仅在多行宏定义或某些我不知道的特殊情况下有用。

答案 2 :(得分:-1)

检查非常简单

void printbuff(const char *str, size_t len)
{
    while(len--)
    {
        printf("%03d = '%c'\n", *str, *str >= ' ' && *str < 127 ? *str : ' ');
        *str++;
    }
}

int foo()
{
    char buff[32];
    int a=65;
    size_t len;
    printf("%d\n", len = sprintf(buff, "%d\
    \n",a));
    printbuff(buff, len);
    return 0;
}

int bar()
{
    char buff[32];
    int a=65;
    size_t len;
    printf("%d\n",len = sprintf(buff, "%d\n",a));
    printbuff(buff, len);
    return 0;
}

int main()
{
    foo();
    bar();
}

检查一下自己,您就会知道

它只是行首和'\n'之间的一个或多个char,因为它仍然是相同的字符串。那里有什么取决于编辑器。

Godbolt例如添加4个空格

https://godbolt.org/z/boPYNs