C stdout printf

时间:2010-04-09 07:14:29

标签: c printf stdout

打印数据时遇到了一个奇怪的问题。我使用printf打印char *字符串,然后打印另一个字符串。但是,第一个字符串的一部分不会被打印,当我打印第二个字符串时,第一个字符串的缺失部分会被添加到该字符串之前。这里发生了什么?

我正在写一个简单的libpcap implimentation。这是一个示例回调函数,它将产生相同的结果。我尝试在打印后删除缓冲并添加putchar('\ n'),但它没有帮助。

void ParseData(u_char* useless, const struct pcap_pkthdr* pkthdr, const u_char* packet){
   int packetLen, i;
   packetLen = pkthdr->len;
   for (i = 0; i < packetLen; i++){
      putchar(packet[i]);
   }
}

4 个答案:

答案 0 :(得分:7)

stdio缓冲字符。除非你另有说明,否则它通常只会在看到换行符时才发出写入。如果你想要一个不同的行为,你可以用其中一些来补救:

  • 在您的第一个printf之后,请致电fflush(stdout);以刷新缓冲区。

  • 或者,呼叫setbuf(stdout, NULL);以禁用缓冲。在执行任何printf之前执行此操作。

  • 通过编码到stdio(POSIX)或write(Windows)等平台特定API来绕过WriteFile。通常我会建议不要这样做,特别是像stdout ..

  • 这样的事情

答案 1 :(得分:2)

你的第一个printf有可能最后没有'\ n'。在某些情况下,当遇到'\ n'时,数据可能会被缓冲并打印在一起。

但是,这只是猜测。如果您无法发布代码,请尝试以上内容。

答案 2 :(得分:1)

它被称为文件流缓冲。

您可以使用setvbuf()禁用它或更改缓冲区的大小。或者每次打印后只需fflush()。但是,当存在行终止符(\ n)时,(通常)刷新流缓冲区。

答案 3 :(得分:0)

我有类似的经历,但这与双字节有关。我有两个char *背靠背定义。我在第一个字符串中读了一些字符。结果是双字节,所以字符串的剩余部分溢出到第二个字符串。