打印数据时遇到了一个奇怪的问题。我使用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]);
}
}
答案 0 :(得分:7)
stdio
缓冲字符。除非你另有说明,否则它通常只会在看到换行符时才发出写入。如果你想要一个不同的行为,你可以用其中一些来补救:
在您的第一个printf
之后,请致电fflush(stdout);
以刷新缓冲区。
或者,呼叫setbuf(stdout, NULL);
以禁用缓冲。在执行任何printf
之前执行此操作。
通过编码到stdio
(POSIX)或write
(Windows)等平台特定API来绕过WriteFile
。通常我会建议不要这样做,特别是像stdout
..
答案 1 :(得分:2)
你的第一个printf有可能最后没有'\ n'。在某些情况下,当遇到'\ n'时,数据可能会被缓冲并打印在一起。
但是,这只是猜测。如果您无法发布代码,请尝试以上内容。
答案 2 :(得分:1)
答案 3 :(得分:0)
我有类似的经历,但这与双字节有关。我有两个char *背靠背定义。我在第一个字符串中读了一些字符。结果是双字节,所以字符串的剩余部分溢出到第二个字符串。