strcpy() の使い方
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 16/63。
strlen() を使って文字列の長さを取得する方法を学びましたが、ある文字列の内容を別の文字列にコピーする必要がある場合はどうすればよいでしょうか?C言語では、通常の変数のように代入演算子(=)を使って文字列をコピーすることはできません。
その理由は、文字列は文字の配列であり、配列に対して = を使用すると、実際のデータではなくメモリアドレスのみがコピーされるからです。そのため、<string.h> ライブラリの strcpy() 関数が必要不可欠になります。
#include <stdio.h>
#include <string.h>
char source[] = "Hello";
char destination[20];
strcpy(destination, source); // destination に "Hello" をコピーしますstrcpy()関数は、コピー先となる配列(コピー先の場所)と、コピー元となる文字列(コピーしたい内容)の2つの引数を取ります。これは、ヌル終端文字を含め、コピー元からコピー先へ各文字をコピーします。
コピー先の配列が、ソース文字列全体とヌル終端文字を保持するのに十分な大きさであることを確認することが重要です。コピー先が小さすぎると、strcpy() は配列の境界を越えて書き込みを行い、未定義の動作を引き起こします。
この関数はC言語における文字列操作の基本であり、文字列の複製、既存の内容による文字列変数の初期化、およびその後の処理に向けた文字列の準備を可能にします。
チャレンジ
簡単strcpy() 関数を使用して文字列のコピーを行う C プログラムを作成してください。プログラムは以下の手順を実行する必要があります:
- 実行する文字列操作の数を示す整数
nを読み取ります。 - 各操作について:
- 入力からコピー元の文字列(source string)を読み取ります。
- 100 要素を持つ
destinationという名前の文字配列を宣言します。 strcpy()を使用して、source 文字列を destination 配列にコピーします。- 元の source 文字列とコピーされた destination 文字列の両方を出力します。
- すべての操作の後、コピーされた文字列が独立していることを証明するために:
- 最後の destination 配列の最初の文字を 'X' に変更します。
- 変更されたことを示すために、変更後の destination 文字列を出力します。
strcpy() 関数を使用するために、<string.h> ヘッダーをインクルードすることを忘れないでください。
出力は以下の形式で結果を表示する必要があります:
Source: [source_string]
Destination: [copied_string]
Source: [source_string]
Destination: [copied_string]
...
Modified last destination: [modified_string]例えば、入力が以下の場合:
3
hello
world
programming出力は以下のようになります:
Source: hello
Destination: hello
Source: world
Destination: world
Source: programming
Destination: programming
Modified last destination: Xrogrammingこのチャレンジでは、strcpy() を使用してある文字配列から別の文字配列へ文字列の内容をコピーする方法、destination 配列に対する適切なメモリ割り当て、およびコピーされた文字列がコピー元から独立していることの理解をテストします。
チートシート
C言語で文字列をコピーするには、<string.h>ライブラリのstrcpy()を使用します。代入演算子(=)を使用して文字列をコピーすることはできません。なぜなら、それはメモリ番地をコピーするだけで、実際の内容をコピーするわけではないからです。
#include <stdio.h>
#include <string.h>
char source[] = "Hello";
char destination[20];
strcpy(destination, source); // "Hello" を destination にコピーしますstrcpy()関数は、コピー先となる配列(コピー先)とコピー元となる文字列(コピー元)の2つの引数を取ります。これは、ヌル終端文字を含め、コピー元からコピー先へ各文字をコピーします。
未定義の動作を避けるために、コピー先の配列は、コピー元の文字列全体とヌル終端文字を保持するのに十分な大きさである必要があります。
自分で試してみよう
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char source[100];
char destination[100];
// TODO: ここにコードを記述してください
// ループを使用して n 個の文字列操作を処理します
// 各操作について:
// - ソース文字列を読み込む
// - strcpy() を使用してソースをコピー先にコピーする
// - 指定された形式で両方の文字列を出力する
// TODO: ループの後、最後のコピー先の最初の文字を変更し、
// 変更された文字列を出力します
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。