Menu
Coddy logo textTech

strcat() の使い方

CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 17/63。

strcpy() を使って文字列をコピーする方法を学びましたが、2つの文字列を結合したい場合はどうすればよいでしょうか?これは連結(concatenation)と呼ばれ、C言語はこの目的のために <string.h> ライブラリの strcat() 関数を提供しています。

strcat() 関数は、ある文字列の内容を別の文字列の末尾に追加します。この関数は2つの引数を取ります。コピー先(destination)の文字列(変更されます)と、コピー元(source)の文字列(末尾に追加されます)です。

#include <stdio.h>
#include <string.h>

char greeting[20] = "Hello";
char name[] = " World";
strcat(greeting, name);  // greetingは現在 "Hello World" を含んでいます

連結先の文字列には、元の内容と新しく追加される内容の両方を保持するのに十分なスペースがあることが不可欠です。strcat() 関数は、連結先の文字列内のヌル終端文字を探して削除し、その場所に連結元の文字列をコピーして、最後に新しいヌル終端文字を追加します。

この関数は、個々の単語から完全な文章を作成したり、ユーザーの入力と定義済みのテキストを組み合わせたりするなど、小さな断片からより長い文字列を構築するために不可欠です。

数値を連結する前に、文字列に変換する必要がある場合があります。これには、<stdio.h>(ほとんどのCプログラムに既に含まれています)の sprintf() を使用できます。sprintf()printf() と同じように動作しますが、画面に出力する代わりに、フォーマットされた結果を文字配列に書き込みます。


例えば、整数を文字列に変換するには次のようにします:

int age = 25;
char ageStr[10];
sprintf(ageStr, "%d", age);  // ageStr には "25" が格納されます

char result[30] = "Age: ";
strcat(result, ageStr);       // result には "Age: 25" が格納されます

sprintf() の第1引数はコピー先の文字配列、第2引数はフォーマット文字列(printf() と同じ書式指定子を使用)、残りの引数は挿入する値です。
challenge icon

チャレンジ

簡単

strcat() 関数を使用して文字列を連結し、パーソナライズされたメッセージを作成する C プログラムを作成してください。プログラムは以下の手順で行う必要があります:

  1. 処理する人数を表す整数 n を読み取ります。
  2. 各人について:
    • 入力から名(first name)を読み取ります。
    • 入力から姓(last name)を読み取ります。
    • 100個の要素を持つ fullName という名前の文字配列を作成します。
    • strcpy() を使用して、名を fullName にコピーします。
    • strcat() を使用して、半角スペース " " を fullName に追加します。
    • strcat() を使用して、姓を fullName に追加します。
    • 150個の要素を持つ greeting という名前の文字配列を作成します。
    • strcpy() を使用して、"Hello, " を greeting にコピーします。
    • strcat() を使用して、fullNamegreeting に追加します。
    • strcat() を使用して、"! Welcome to our program." を greeting に追加します。
    • 最終的な挨拶メッセージを出力します。
  3. 全員の処理が終わった後、サマリーメッセージを作成します:
    • 100個の要素を持つ summary という名前の文字配列を作成します。
    • strcpy() を使用して、"Total people processed: " を summary にコピーします。
    • 数値 n を文字列に変換し、strcat() を使用して summary に追加します。
    • サマリーメッセージを出力します。

文字列関数を使用するために <string.h> ヘッダーをインクルードすることを忘れないでください。

出力は以下の形式で表示される必要があります:

Hello, [FirstName LastName]! Welcome to our program.
Hello, [FirstName LastName]! Welcome to our program.
...
Total people processed: [n]

例えば、入力が以下の場合:

2
John
Doe
Alice
Smith

出力は以下のようになります:

Hello, John Doe! Welcome to our program.
Hello, Alice Smith! Welcome to our program.
Total people processed: 2

このチャレンジでは、strcat() を使用して複数の文字列を連結する方法、strcpy() と組み合わせて初期文字列をセットアップする方法、および複数のコンポーネントから複雑な文字列を段階的に構築する方法についての理解をテストします。

チートシート

<string.h>strcat() 関数は、コピー元(source)の文字列をコピー先(destination)の文字列の末尾に追加することで、2つの文字列を連結(結合)します。

構文: strcat(destination, source)

#include <stdio.h>
#include <string.h>

char greeting[20] = "Hello";
char name[] = " World";
strcat(greeting, name);  // greeting には "Hello World" が格納されます

重要:コピー先の文字列は、元の内容と追加される内容の両方を保持するのに十分なスペースが必要です。この関数は、コピー先のヌル終端文字を探して削除し、その場所にコピー元の文字列をコピーして、最後に新しいヌル終端文字を追加します。

<stdio.h>sprintf() 関数は printf() と同様に動作しますが、フォーマットされた結果を表示するのではなく、char配列(文字列)に書き込みます。これにより、整数(またはその他の値)を文字列に変換するのに便利です。

構文: sprintf(destination, format, value)

#include <stdio.h>

int num = 42;
char numStr[10];
sprintf(numStr, "%d", num);  // numStr には "42" が格納されます

重要:コピー先の配列は、ヌル終端文字を含む結果の文字列を保持するのに十分な大きさである必要があります。

自分で試してみよう

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    // 人数を読み込む
    int n;
    scanf("%d", &n);
    
    // TODO: 以下にコードを記述してください
    // 各人を処理し、挨拶メッセージを作成する
    // その後、要約メッセージを作成して表示する
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン