3

文字列リテラルを関数に渡す必要があります

myfunction("arg1" DEF_CHAR "arg1");

その構築された文字列リテラルの一部は、関数の戻り値である必要があります

stmp = createString();
myfunction("arg1" stmp "arg2"); //oh that doesn't work either

これを1行で行う方法はありますか?

myfunction("arg1" createString() "arg2"); //what instead?

注: C のみでお願いします。

私の目標は、この =/ の新しい char 配列の初期化を避けることです

4

5 に答える 5

4

実行時に文字列リテラルを作成することはできませんが、次のように文字列を作成できます。

char param[BIG_ENOUGH];

strcpy(param, "arg1");
strcat(param, createString());
strcat(param, "arg2");
myfunction(param);
于 2010-04-09T20:38:40.633 に答える
2
char buffer[1024] = {0};
//initialize buffer with 0 
//tweak length according to your needs

strcat(buffer, "arg1");
strcat(buffer, createString()); //string should be null ternimated
strcat(buffer, "arg2");

myfunction(buffer);
于 2010-04-09T20:39:39.660 に答える
2

C は動的文字列をサポートしていないため、あなたが試みていることは不可能です。createString() 関数からの戻り値はリテラルではなく変数であるため、他のリテラルと連結することはできません。そうは言っても、これを 1 行にまとめることが本当に重要な場合は、次のようなヘルパー関数を作成して、これを容易にすることができます。

char * my_formatter( const char * format, ... )
{
...
}

myfunction(my_formatter("arg1%sarg2", createString()));

ただし、このアプローチには、メモリ管理とスレッド セーフの問題がいくつかあります。

于 2010-04-09T20:41:55.590 に答える
1

これには文字配列を作成する必要があります。文字列リテラルのみがコンパイラによって連結されます。

于 2010-04-09T20:38:36.843 に答える
0

いいえ。文字列を連結するために新しいバッファを割り当てずに純粋な C でこれを行う方法はありません。

于 2010-04-09T20:38:51.243 に答える