2

私のコードでは、以下のように snprintf を使用しており、次の動作を確認できます。

char text[30] = {0};

snprintf(text, sizeof(text), "%s", "hello");
printf("Interm... %s\n", text);
snprintf(text, "%20s", text);
printf("At the end ... %s\n", text);

出力

Interm... hello
At the end ... 

ご覧のとおり、snprintf の送信元と送信先が同じであれば、バッファをクリアします。出力を 20 年代の書式指定子にしたい。複数の文字列を追加し、最後のステップでフォーマット指定子を実行する必要があるため、最初のステップ自体でこれを行うことはできません。

一時バッファにコピーし、そこから元のバッファにコピーすることが唯一の可能な解決策ですか? これに光を当ててください。

4

2 に答える 2

5

マニュアルページからsnprintf

C99 および POSIX.1-2001 では、sprintf()、snprintf()、vsprintf()、または vsnprintf() の呼び出しによって重複するオブジェクト間でコピーが行われる場合 (たとえば、ターゲット文字列が配列と指定された入力引数の 1 つが同じバッファーを参照しています)。

これは、次の行を意味します。

snprintf(text, "%20s", text)

無効です。追加の一時的なバッファを使用するというあなたの提案は正しいです。

于 2013-08-28T16:26:02.290 に答える
0

目標を達成するには: str1 の後に str2 が続き、そのすべてが左側にスペースで埋められるか、右側が切り捨てられて (wid) 文字の長さになり、outbuf に格納されます (幅は少なくとも wid+1 文字でなければなりません)。 ) sprintf を 1 つだけ使用できます...

size_t len1=strlen(str1), len2=strlen(str2);
if (len2 > wid-len1) { len2 = wid-len1; }
snprinf(outbuf, wid+1, "%*s%.%s", wid-len2, str1, len2, str2);

(wid-len2) は出力時の str1 のパディングされたサイズであり、len2 は出力時の str2 の切り捨てられたサイズであることに注意してください。snprintf() の wid+1 バッファー サイズは、len1>wid という異常なケースに対するガードです。

于 2013-08-28T18:04:47.093 に答える