我正在将旧代码库从 Borland C 移植到 C99。我遇到了以下函数,它看起来应该将零字节复制到缓冲区中。
sprintf(tx_tcp_buf,"%0s%0s%0s%0s%0s%0s",strHeader, ccSTX, drValidity, ccUS, "Y",ccETX);
的声明tx_tcp_buf
是static 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 尤其感兴趣。但是了解其他人会很好。