【问题标题】:Why am I Strange Output when using printf in C? [duplicate]为什么在 C 中使用 printf 时输出奇怪? [复制]
【发布时间】:2021-05-06 20:18:55
【问题描述】:

我一直在解决这个问题:

#include<stdio.h>
int main()
{
    printf(5 + "Good Morning ");
    return 0;
}

为什么会打印 Morning?

有什么解释吗?

【问题讨论】:

  • 提示:"Good Morning " - 是指向包含字符串的内存位置的指针。剩下的就是指针算术了。
  • 程序从位置5开始读取char数组。char *p -> 5 + p相当于&amp;p[5]
  • 改写成char *p = "Good Morning "; printf(p + 5);会有帮助吗?
  • 你觉得这会打印什么printf(0 + "Good Morning ");

标签: c printf c-strings string-literals pointer-arithmetic


【解决方案1】:

在这个 printf 调用中

printf(5 + "Good Morning ");

这里使用了类型为char[14] 的字符串文字"Good Morning "。在表达式5 + "Good Morning " 中使用,它被转换为指向其第一个字符的指针,类型为char *

因此,由于指针算法,具有char * 类型的表达式指向字符串文字中等于5 的元素(位置从0 开始)。那就是它指向原始字符串文字的子字符串"Morning "。并输出该子字符串。

您可以等效地重写调用以下方式使其更清晰

char * literal = "Good Morning ";
printf( literal + 5 );

char * literal = "Good Morning ";
printf( &literal[5] );

甚至喜欢

printf( &"Good Morning "[5] );

这是一个演示程序,但我使用的是puts,而不是printf

#include <stdio.h>

int main(void) 
{
    size_t i = 0;
    
    while ( puts( i + "Good Morning " ) != 1 ) i++;

    return 0;
}

程序输出是

Good Morning 
ood Morning 
od Morning 
d Morning 
 Morning 
Morning 
orning 
rning 
ning 
ing 
ng 
g 
 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-29
    • 2016-03-22
    • 2013-04-06
    • 2011-05-23
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多