代码之家  ›  专栏  ›  技术社区  ›  Ilia Choly

C标准输出打印

  •  0
  • Ilia Choly  · 技术社区  · 15 年前

    我对打印数据有一个奇怪的问题。我用printf打印一个char*字符串,然后再打印另一个。但是,第一个字符串的一部分不会被打印出来,当我打印第二个字符串时,第一个字符串的缺失部分将被预处理到该字符串。这里发生了什么?

    我正在写一个简单的libpcap请求。下面是一个将产生相同结果的回调函数示例。我尝试在打印后删除缓冲区并添加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 回复  |  直到 9 年前
        1
  •  7
  •   asveikau    15 年前

    stdio 缓冲区字符。除非您另有说明,否则通常只有当它看到换行符时,它才会实际发出一个write。如果你想要一个不同的行为,你可以用以下方法来补救:

    • 第一次之后 printf ,呼叫 fflush(stdout); 冲洗缓冲器。

    • 或者,拨打 setbuf(stdout, NULL); 禁用缓冲。在你做任何事之前先做这个 普林特 S.

    • 旁路 STDIO 通过编码到平台特定的API,如 write (POSIX)或 WriteFile (窗口)。通常我会建议你不要这样做,尤其是像 stdout

        2
  •  2
  •   Jay    15 年前

    您的第一张打印件末尾可能没有'\n'。在某些情况下,当遇到“n”时,数据可能会被缓冲并一起打印。

    但是,这只是一个猜测。如果无法发布代码,请尝试上面的操作。

        3
  •  1
  •   jweyrich    15 年前

    这叫做文件流缓冲。

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

        4
  •  0
  •   Chuk Lee    15 年前

    我有类似的经验,但这与双字节有更多的关系。我有2个字符*定义背靠背。我在第一个字符串中读了一些字符。原来是双字节的,所以字符串的剩余部分溢出到第二个字符串。