了解C exit()和stderr消息行为

了解C exit()和stderr消息行为,c,C,我不明白为什么在我的代码中会发生以下行为 首先让我们检查是否存在可除以5的数字 int count = 1; while (count < 10) { if (count%5 == 0) { fprintf(stderr, FIND); exit(1); } else { printf("Not Yet"); count += 1; } 无论如何,我试图通过在if语句中再添加一行来进行调试 int count = 1; while (

我不明白为什么在我的代码中会发生以下行为

首先让我们检查是否存在可除以5的数字

int count = 1;
while (count < 10) {
  if (count%5 == 0) {

      fprintf(stderr, FIND);
      exit(1);
  } else {
    printf("Not Yet");
    count += 1;
  }
无论如何,我试图通过在if语句中再添加一行来进行调试

int count = 1;
while (count < 10) {
  if (count%5 == 0) {
      printf("%d\n", count);
      fprintf(stderr, INVALID_LINE);
      exit(1);
  } else {
    printf("Not Yet");
    count += 1;
  }
}
我不明白

第一段代码,为什么即使条件不满足,程序也会执行if语句


第二个代码,当添加一个打印行时,代码实际上表现为我所期望的无缓冲状态。你给它写的任何东西都会立即消失
stdout
,它被写入到
printf
中,是行缓冲的——它只有在遇到新行字符时才会消失。

如果您希望程序的各种输出之间存在位置/时间关系,那么将它们全部指向同一个流。实际上,您正在将部分输出打印到
stderr
,将其他输出打印到
stdin
(默认情况下)。您使用的是什么平台?您使用的是什么C库?
stderr
默认情况下不缓冲。而标准输出是缓冲的。这就是为什么stderr输出在stdout输出之前进入屏幕。如果您使用
return 1
而不是
exit(1)
,则在程序退出之前,您会得到所有的标准输出,但它们在标准输出消息(在屏幕上)之后仍会保持不变。如前面提到的@hesham_EE,
stderr
是无缓冲的,因此,在缓冲
stdout
时,它将立即打印,并且在发送换行符
'\n'
或调用
fflush
手动刷新之前,它不能保证打印。如果您在if语句中添加了一行代码,并且它如何改变了打印顺序,您添加了换行符,允许
stdout
刷新。是否有可能在特定条件下使用stderr()打印错误消息?这样,当错误发生时;我可以在stdout控制台中打印部分消息。很抱歉,我不明白你在问什么。很抱歉造成混淆,基本上我正在编写一个代码,读取一个文件,并从文件中提取一些文本,然后在控制台中逐行打印;然而,有时我试图提取的文本不在文件中;在这种情况下,我希望打印错误消息到stderr();然而,当我的程序继续运行时,在遇到这样的错误之前,我仍然希望打印正在进行的提取消息(因此,当出现错误时,程序停止,并且仍然在控制台上打印部分文本);通过使用stderr();我的程序将立即终止
int count = 1;
while (count < 10) {
  if (count%5 == 0) {
      printf("%d\n", count);
      fprintf(stderr, INVALID_LINE);
      exit(1);
  } else {
    printf("Not Yet");
    count += 1;
  }
}
Not YetNot YetNot YetNot Yet5
FIND