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 に興味があります。でも、他人のことを知れて良かったです。