0

我正在将旧代码库从 Borland C 移植到 C99。我遇到了以下函数,它看起来应该将零字节复制到缓冲区中。

sprintf(tx_tcp_buf,"%0s%0s%0s%0s%0s%0s",strHeader, ccSTX, drValidity, ccUS, "Y",ccETX);

的声明tx_tcp_bufstatic BYTE tx_tcp_buf[150] = {0};

所有strHeader, ccSTX, drValidity, ccUS, 和ccETX都是 类型char *

困扰我的是格式字符串中的长度说明符。这是我第一次遇到字符串的长度说明符为零。在这里,我们%0s从我读到的内容中得到了应该复制零字节的内容。(那么上面的调用sprintf是什么?)

我没有 Borland C 的副本,但我在 GCC 中尝试了以下程序:

#include <stdio.h>
int main() {
     char buf[256];
     char * hello = "Hello, World!\n";
     printf(buf, "%0s", hello);
     printf("\"%s\"\n",buf);
}

它的输出是

"Hello, World!
"

显然,%0s没有做太多%s不会做的事情。但是-pedantic -Wall -std=c99,我收到一个警告,其中特别提到了一些gnu_printf格式:

warning: '0' flag used with '%s' gnu_printf format [-Wformat=]
       sprintf(tx_tcp_buf,"%0s%0s%0s%0s%0s%0s",strHeader,ccSTX,drStatus,ccUS,"I",ccETX);

不同的编译器在这里有不同的行为吗?我对 Borland C 和 GCC 尤其感兴趣。但是了解其他人会很好。

4

0 回答 0