1

私は古代のコードを修正するのに行き詰まっており、これが今日の問題です:

output_file_status = fprintf ( data_file, "%03d%08s%+014.2f%06.3f%",
    LongValue, CharStarValue, Double1, Double2 );

Lint32 の生成: Lint32 の結果は「不正な形式の文字列」になります</p>

%1) フォーマット文字列が記号で終わらないことに同意しますか? %スタンドアローンに意味があるとは思えません。

2) 末尾の を削除するか、%追加の を追加して%も、同じ警告が表示されます。

これは Oracle Pro*C コンパイラを使用しています (つまり、CharStarValue は実際には (char*)VarChar.arr です)。

4

2 に答える 2

2

それを少しずつ取る:

"%03d" はint. OPはaを提供しLongValueます。のlong場合、指定子は"%03ld"にする必要があります。

"%08s" は へのポインタを期待していますchar。OP用品CharStarValue。わかった。ただし、指定子の「0」は、 の未定義の動作です%s「%8s」を推奨

"%+014.2f" はdouble. わかった。フラグ「+」、「0」は問題ありません。

"%06.3f" はdouble. わかった。フラグ「+」、「0」は問題ありません。

"%" の後に何かが必要です。それ以外の場合の動作は undefinedです。削除または "%%" をお勧めします。


OPの2点に

1 適切な形式は、単独の で終わるべきではありません%が、ペア%%の で終わる場合があります。
スタンドアロン%では、「変換仕様が無効な場合、動作は未定義です」 C11 7.21.6.1 9.

2 すべての警告を取り除くには、 を試してください"%03ld%8s%+014.2f%06.3f"

于 2013-09-06T15:58:55.587 に答える
2

%はい、最後にそれ自体がエラーであることは正しいです。フォーマットされた出力で%%1 つのリテラルを生成する必要があります。%

%03dあなたのリンターも、値を使用した使用について不平を言っている可能性がありlongます。それはする必要があります%03ld

于 2013-08-29T00:27:07.553 に答える