0

以下が機能しないことはわかっていますが、同等のものはありますか?

const char *foo = "foo";
static char *end = sprintf ("%s_bar", foo);

私がしたいのは、文字列を連結し、連結された文字列を静的変数にしてグローバル変数にすることです。また、メモリを char に割り当てる必要がないことも気に入っています。main()関数 (sprintf) を使用して 2 つの文字列をマージする必要があるため、これを入力する必要があります。

4

3 に答える 3

1

表面的には、次のようにコードを修正できます。

#define FOO_INITIALIZER "foo"

const char *foo = FOO_INITIALIZER;
static char *end = FOO_INITIALIZER "_bar";

どれだけお得かはわかりませんが、コンパイルして文字列の繰り返しを避ける必要があります。隣接する文字列リテラルの連結を使用します。これは、C89 以降では標準です (ただし、標準化前のコンパイラでは使用されません)。

于 2013-08-01T14:54:09.940 に答える
1

文字列化演算子でできると思います。

#define STR_CONCAT(x, y)      #x#y

static char *end = STR_CONCAT(foo, _bar);

int main(void)
{
    printf("%s", end); // prints out "foo_bar"
    getchar();
    return 0;
}
于 2013-08-01T14:54:40.677 に答える
1

sprintfint sprintf(char *str, const char format, ...);として宣言されています。char* strは出力が書き込まれるバッファーですが、悪意のあるユーザーがそのバッファーのサイズよりも多くをそのバッファーに書き込む可能性があるsnprintfため、出力バッファーのサイズを含むパラメーターを含む which を使用して、バッファーオーバーフローが発生しないようにすることもできます。注意すべきことは、書き込まれたバイト数を返すため、charまたは char[] に割り当てることはできません。

const char* foo = "foo";
static char end[BUFSIZE];
snprintf(end, BUFSIZE, ""%s_bar", foo);

snprintfセキュリティエラーであるバッファオーバーフローが簡単に発生しないため、使用することを好みます。snprintf が strlen(" s_bar ") + strlen("foo"); を返した場合、連結が成功したかどうかを確認できるようになりましたBUFSIZend

あなたもできることは次のとおりです。

char end[BUFSIZE] = "foo_";
strncat( end, "_bar", BUFSIZ);

それはおそらくあなたが好きなものです。

于 2013-08-01T14:39:08.810 に答える