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};.

strHeaderccSTXdrValidityccUS、およびはすべてccETXchar *です。

私を悩ませているのは、フォーマット文字列の長さ指定子です。文字列の長さ指定子がゼロに遭遇したのはこれが初めてです。ここで、私が%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