我对以下程序的执行有疑问。
#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嘿朋友”。虽然声明:printf(“%s%s”,p,p1);在睡眠声明之前那么为什么它在睡觉之前不打印而且它再打印一个地址意味着它再次进入循环。有人可以解释一下上述程序的工作原理。它是否与printf函数的缓冲区有关?
答案 0 :(得分:11)
stdout是行缓冲的。当您打印\n
或退出应用程序时,会发生实际的打印输出。
使用:
printf("%s %s\n",p,p1);
或者:
fflush(stdout);
编辑:解决另一个问题......
printf("\n%p",p);
这会打印换行符首先,然后打印一个地址。
printf("%s %s",p,p1);
这会打印一个空字符串(因为p指向0终止符)空格和原始字符串。
循环完成后,您已经打印了最后一个地址(但是没有刷新)。你睡觉了,然后你打印一个空字符串,一个空格和原始字符串。
如果您更改了最后一个printf以使用"%p %s"
,则会更清楚发生了什么。