2

複数の文字列を結合するにはどうすればよいですか。例えば、

char item[32];
scanf("%s", item);
printf("Shopping list: %s\n", item); //I want to combine this string 
char string_2[] = "To do list: Sleep\n"; // with this string 
char hw[32];
scanf("%s", hw); 
printf("Homework: %s\n", hw); // and this string

したがって、次のように印刷されます。

買い物リスト: (アイテム)

やることリスト:寝る

宿題: (はぁ)


しかし、上記のコードのように個別に printf 命令を出すのではなく、文字列を結合して最後に printf を呼び出します。


このようなものを別の文字列に保存できないので、どうすればこれを行うことができますか?char string1 = ("Shopping list: %s \n", item)

4

6 に答える 6

2

使用strcpyしてstrcat

char item[] = "Shopping list";
char hw[] = "To do list: Sleep \n";
char* itemhw;
itemhw = malloc(strlen(item)+strlen(hw)+1);
strcpy(itemhw, item);
strcat(itemhw, hw); 
free(itemhw);
于 2012-10-08T05:59:06.470 に答える
2

できれば関数を使用して、文字列を連結しますstrcat

ただし、連結先の文字列がすべて (終了文字を含む) に収まる十分な大きさであることを確認してください'\0'

于 2012-10-08T05:56:15.837 に答える
1

使用できますsprintf

char combinedstring[100];
sprintf(combinedstring,"%s %s %s",item,string_2,hw);

string.hヘッダーとその機能を調べることもできます。

于 2012-10-08T05:55:32.203 に答える
1

Cで生の文字列を処理するのは常に醜いです。文字列を連結するには、次の 2 つの手順を実行する必要があります。

  1. 新しい文字列にメモリを割り当てます。

  2. ソース文字列を新しいバッファにコピーします。

教訓として、この質問には既に 3 つの異なる答えがあり、 3 つの異なるバッファー オーバーラン エラーがあることに注意してください。

以下は、2 つの文字列を連結して新しい文字列を返す関数です。

char *astrcat(const char *x, const char *y)
{
    size_t nx = strlen(x), ny = strlen(y);
    char *z = malloc(nx + ny + 1);
    if (!z)
        return NULL;
    memcpy(z, x, nx);
    memcpy(z + nx, y, ny + 1);
    return z;
}

これを拡張して 3 つの文字列で動作させることも、単に 2 回呼び出すこともできます。健全な人々は、ライブラリを使用するか、固定サイズのバッファを多用する傾向があります。

代替案: 固定サイズのバッファーとsnprintfを使用すると、安全性と使いやすさが得られますが、固定サイズのバッファーにとらわれてしまいます。

const char *x = ..., *y = ...;
char buf[100];
snprintf(buf, sizeof(buf), "%s%s", x, y);

を持っていない場合はsnprintf、おそらく MSVC を使用しています。_snprintfこれはほぼ同じですが、出力が常にヌル終了するとは限りません。

strcatorを使用しないでくださいstrcpy:strcat許容できる状況はほとんどありません:

char buf[100];
strcpy(buf, x); // buffer overflow
strcat(buf, y); // buffer overflow

使用しないでくださいsprintf:また、オーバーフローします:

char buf[100];
sprintf(buf, "%s%s", x, y); // buffer overflow
于 2012-10-08T06:07:13.710 に答える
1

私が無視しようとしている問題は複数あります (入力と出力の順序付け、入力のエラー処理、入力時のバッファー オーバーフロー、エントリ内の単一の単語と複数の単語など)。

char item[32];
scanf("%s", item);
char hw[32];
scanf("%s", hw);
char string_2[] = "To do list: Sleep\n";

printf("Shopping list: %s\n%sHomework: %s\n", item, string_2, hw);

printf()これにより、連結された出力を提供する単一のステートメントが得られます。明らかに、連結は出力ファイル (標準出力) にあり、メモリに直接ありません。文字列をメモリに連結したい場合は、コピーするのに十分なメモリがあることを確認するためにいくつかの操作を行う必要がありますが、代わりに次snprintf()のようにジョブに使用できます。printf()

char item[32];
scanf("%s", item);
char hw[32];
scanf("%s", hw);
char string_2[] = "To do list: Sleep\n";

// This length does account for two extra newlines and a trailing null
size_t totlen = strlen(item) + strlen(homework) + sizeof(string_2) +
                sizeof("Shopping list: ") + sizeof("Homework: ");
char *conc_string = malloc(totlen);

snprintf(conc_string, totlen, "Shopping list: %s\n%sHomework: %s\n",
         item, string_2, hw);
于 2012-10-08T06:11:57.507 に答える
0

素晴らしいが未知の open_memstream() 関数の使用を検討してください。

FILE *open_memstream(char **ptr, size_t *sizeloc);

使用例:

// open the stream
FILE *stream;
char *buf;
size_t len;
stream = open_memstream(&buf, &len);

// write what you want with fprintf()
char item[32];
scanf("%s", item);
fprintf(stream, "Shopping list: %s\n", item);
char string_2[] = "To do list: Sleep\n";
fprintf(stream, "%s\n", string_2);
char hw[32];
scanf("%s", hw); 
fprintf(stream, "Homework: %s\n", hw);

// close the stream, the buffer is allocated and the size is set !
fclose(stream);
printf ("the result is '%s' (%d characters)\n", buf, len);
free(buf);

カーネルにバッファ割り当てを管理させてください。

于 2017-08-29T09:18:39.923 に答える