0

文字列があり、それを文字ポインタとして関数に渡す場合に、この問題が発生します。

 void test(char * str) {
    ....
 }

ここで、str="abc"です。ここで、新しい文字列を作成せずに、この文字列の最後にいくつかの文字を追加します。文字列の最後に何文字追加するのか、何を追加するのかわからないため、strcatを使用したくありません。reallocを使用しようとしましたが、strがスタックに割り当てられているため、機能しません。

char配列のサイズを動的に増やす方法はありますか?

更新:私は私のインタビューでこれに関係する質問をされました。追加のスペースを使わずにそれをするように頼まれました。したがって、mallocを使用してメモリを割り当てる場合、技術的には追加のスペースを使用していますか?

ありがとう

4

6 に答える 6

3

いいえ、特に文字列がスタックに割り当てられている場合はそうです。スタックスペースはコンパイル時に固定されます。最初により多くのスペースを割り当てるか、より多くのスペースとstrcpyそれを超える新しいアレイを割り当てる必要があります。

于 2013-03-25T16:37:18.413 に答える
0

delete古い文字列を使用して、必要な長さの新しい文字列を割り当てる必要がありnewます。

于 2013-03-25T16:36:59.607 に答える
0

申し訳ありません。動的変数/配列のサイズを変更することはできません。問題は、別の変数、または別の呼び出しフレームでさえ、問題の変数の直後に続く可能性があることです。コードの他の場所にこれらのオブジェクトへのポインタがある可能性があるため、これらを移動してスペースを作ることはできません。

于 2013-03-25T16:39:26.620 に答える
0

C ++を使用している場合は、に固執しstd::string、取引全体を忘れてくださいchar *

ただし、for文字列を使用する場合は、新しい文字配列を1つの文字列から別の文字列にchar *割り当てます。メモリリークを回避するためにstrcpy()、元のメモリの割り当てを解除することを忘れないでください。char *

面接でこれに関する質問をされました。追加のスペースを使わずにそれをするように頼まれました。したがって、mallocを使用してメモリを割り当てる場合、技術的には追加のスペースを使用していますか?

スペースを追加せずに文字列の長さを増やすにはどうすればよいですか?

于 2013-03-25T16:52:29.880 に答える
0
void test(string  &str) {
    ....
    str += "wibble";
 }

C++で動作するようです

于 2013-03-25T16:52:33.683 に答える
0

realloc(スタックでは実行されない)またはstrcpy(追加のバッファースペースを使用)を使用する代わりに、入力文字列の直後のバイトから新しい値を格納できます。以下の簡単な例では、「abcd」で始まり、関数fnの最後に3つのzを追加します。

void fn(char *str)
{
    int len = strlen(str);
    memset(str+len, 'z', 3);
    str[len+3] = 0;
    return;
}

int main()
{   
    char s[] = "abcd";
    printf("%s\n", s);
    fn(s);
    printf("%s\n", s);  
}

出力:

abcd
zzz

この方法は、元の文字列の前に別の文字列を追加するように拡張できます。

于 2013-03-25T17:58:12.030 に答える