機能に問題があります。どのように何も印刷されないのですか?Cでポインタポインタを使用してsprintfを使用する方法
char * CombineStr(char * str1, char * str2)
{
char strOut[256];
sprintf(strOut, “%s%s”, str1, str2);
return strOut;
}
機能に問題があります。どのように何も印刷されないのですか?Cでポインタポインタを使用してsprintfを使用する方法
char * CombineStr(char * str1, char * str2)
{
char strOut[256];
sprintf(strOut, “%s%s”, str1, str2);
return strOut;
}
あなたはスコープのケア(あなたの変数の記憶域期間を)取る必要があります:静的として返される変数を宣言するか、malloc
を使用して、ヒープ上に動的に割り当て、free
は、割り当てられたメモリがstrOut
により、一度必要としないように指摘するもう第2引数のsprintf
の形式で平方引用符を使用する必要があります。オーバーフローに注意する必要があります。
次のいずれか
char * CombineStr(char * str1, char * str2)
{
static char strOut[256]; //scope!
if((strlen(str1) + strlen(str2)) < 256)
sprintf(strOut, "%s%s", str1, str2); //plain quotes!
return strOut;
}
またはさらなる読書のために
char * CombineStr(char * str1, char * str2)
{
char strOut = malloc(strlen(str1) + strlen(str2) + 1);
if(strOut != NULL)
sprintf(strOut, "%s%s", str1, str2); //plain quotes!
return strOut;
}
ユーザーが 'CombineStr()'を何度か呼び出して、キャッシュされた結果を後で使用すると、 'static'を使ったハックがうまくいきません。マルチスレッド環境はどうですか? – Sergio
ありがとう@Serhio。ダイナミックアロケーションの例を追加しました。 – user3078414
別の一般的な解決策は、呼び出し元が出力バッファにバッファのオーバーフローを防止するために、sprintf
からsnprintf
にスイッチが連結された文字列バッファの長さを超えるべき
char * CombineStr(const char * str1,
const char * str2,
char * strOut,
size_t outlen)
{
size_t len = snprintf(strOut, outlen, "%s%s", str1, str2);
if (len < outlen)
{
return strOut;
}
return NULL;
}
注を提供することです。これにより、オーバーフローをキャッチして無効な結果を返し、buffer
が信頼できないことを発信者に知らせることができます。
典型的な使用法は、それがsnprintf
がグラグラサポートしており、常にnullで終了されていると信頼することができないことに注意する必要があります
char buffer[256];
if (CombineStr("I's the b'y that builds the boat",
"And I's the b'y that sails her",
buffer,
sizeof(buffer)) != NULL)
{
// use buffer
}
だろうが、あなたはそれがバッファをオーバーフローしていないことを確認することができます。
UB?あなたはスタック内にストロットを割り当てて、関数の戻り時に "割り当てを解除"された場所へのポインタを返しています。 – Amadeus
@Amadeusのローカルはヒープではなくスタックに割り当てられます。 – Sergio
@Serhioは正しい考えを書いた、間違った書き込み – Amadeus