3

私はCに関数があり、2つの異なる場所(サイズは不明、かなり大きい可能性があります)から文字列を取得し、それらを1つの文字列に結合して返します。2つの文字列を出力するだけで正しい結果が得られますが、strcatを使用して文字列を結合しようとすると、5つのガベージ文字が表示され、結合された文字列の結果が表示されます。

誰かが私が間違っていることについていくつかのアドバイスがありますか?これが私がしていることを示すためのいくつかのサンプルコードです:

static int get_information(char** results)
{
    size_t s1_length;
    size_t s2_length;

    /* DEBUGGING - Prints the correct string */
    printf(get_string_1());
    printf(get_string_2());
    printf("\n");

    /* Allocate memory for new string */
    s1_length = strlen(get_string_1());
    s2_length = strlen(get_string_2());
    *results = malloc(sizeof(char) * (dir_length + file_length));

    if(results == NULL)
        return -1;

    /* Combine the strings */
    strcat(*results, get_string_1());
    strcat(*results, get_string_2());

    /* DEBUGGING - prints 5 garbage characters then the correct string */   
    printf(*results);
    printf("\n");

    return 0;
}
4

3 に答える 3

11

strcat宛先でヌルターミネータを見つける必要があります。初期*result化されていないメモリを指しています。これには、5文字のヌルターミネータが含まれています。

*result[0]='\0';文字列を結合する直前に追加すると、修正されるはずです。

また、のヌルターミネータに十分なスペースを割り当てていません*result

于 2011-04-22T04:46:41.743 に答える
6

なぜあなたstrcatは最初の文字列ですか?単にそれをコピーします。それ以外の場合は、初期化されていないメモリにあるすべてのガベージに追加されます...

/* Combine the strings */
strcpy(*results, get_string_1());
strcat(*results, get_string_2());
于 2011-04-22T04:46:27.060 に答える
2

strcat()は宛先が有効な文字列であると想定しているため、次のように追加して有効な文字列にします。

*results[0] = '\0';

strcat()を実行する前に

または、次のことを試してください。

strcpy(*results, get_string_1());
strcat(*results, get_string_2());

最後に、この行で正確に何が起こっているのか:

*results = malloc(sizeof(char) * (dir_length + file_length));

結果に十分なスペースを割り当てるようにしてください。理想的には次のようになります。

*results = malloc(sizeof(char) * (s1_length+s2_length+1));

s1およびs2として十分なスペースを割り当て、その後に「\0」文字を終了するため。

于 2011-04-22T04:57:50.557 に答える