2016-07-30 5 views
-3

機能に問題があります。どのように何も印刷されないのですか?Cでポインタポインタを使用してsprintfを使用する方法

char * CombineStr(char * str1, char * str2) 
{ 
    char strOut[256]; 
    sprintf(strOut, “%s%s”, str1, str2); 
    return strOut; 
} 
+4

UB?あなたはスタック内にストロットを割り当てて、関数の戻り時に "割り当てを解除"された場所へのポインタを返しています。 – Amadeus

+0

@Amadeusのローカルはヒープではなくスタックに割り当てられます。 – Sergio

+0

@Serhioは正しい考えを書いた、間違った書き込み – Amadeus

答えて

0

static char strOut[256];に変更してください。非常に良い解決策ではありませんが、うまくいくでしょう。

+1

を試してみてください。 – Sergio

+0

@Serhioこの欠点は、静的バッファは1つだけであり、例えば、2つ以上のパラメータ(2+呼び出し)として 'sprintf'で' CombineStr'を使用している場合、結果は間違っています。その理由から、私の解決策は単純でありながら働いていますが、すべてのケースでそうではありません。 – i486

2

あなたはスコープのケア(あなたの変数の記憶域期間を)取る必要があります:静的として返される変数を宣言するか、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; 
} 

は、SOの記事を以下をご覧ください:1を、2

+2

ユーザーが 'CombineStr()'を何度か呼び出して、キャッシュされた結果を後で使用すると、 'static'を使ったハックがうまくいきません。マルチスレッド環境はどうですか? – Sergio

+0

ありがとう@Serhio。ダイナミックアロケーションの例を追加しました。 – user3078414

1

別の一般的な解決策は、呼び出し元が出力バッファにバッファのオーバーフローを防止するために、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 
} 

だろうが、あなたはそれがバッファをオーバーフローしていないことを確認することができます。

関連する問題