我对以下程序的执行有疑问。
#include<stdio.h>
int main(void)
{
char *p="hey friends",*p1;
p1=p;
while(*p!='\0')
{
p++;
printf("\n%p",p);
}
printf("%s %s",p,p1);
sleep(100);
}
当我运行下面的命令时,输出如下:
0x8048521
0x8048522
0x8048523
0x8048524
0x8048525
0x8048526
0x8048527
0x8048528
0x8048529
0x804852a
然后在 100 秒后打印“0x804852b 嘿 friend 们”。虽然语句:printf("%s %s",p,p1);在 sleep 语句之前那么为什么它在进入休眠之前不打印而且它再打印一个地址意味着它再次进入循环。有人可以解释一下上面程序的工作原理。是否与printf函数的缓冲区有关?
最佳答案
stdout 是行缓冲的。当您打印 \n
或退出您的应用程序时,实际的打印输出会发生。
使用:
printf("%s %s\n",p,p1);
或者:
fflush(stdout);
编辑:解决另一个问题...
printf("\n%p",p);
这会打印一个换行符首先,然后是一个地址。
printf("%s %s",p,p1);
这会打印一个空字符串(因为 p 指向终止符 0)、一个空格和原始字符串。
当循环完成时,您已经打印了最后一个地址(但它没有被刷新)。你 sleep ,然后打印一个空字符串、一个空格和原始字符串。
如果您将最后一个 printf 更改为使用 "%p %s"
它会更清楚发生了什么。
关于c - 程序的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197313/