• Xでシェア
  • LINEでシェア
  • このエントリーをはてなブックマークに追加

C言語 strcpyの使い方

この記事のポイント

  • strcpy関数の基本的な使用方法
  • バッファオーバーフローのリスクとその回避法
  • strncpy関数などの安全な代替関数の活用
  • 文字列操作の応用パターン
  • メモリ管理における注意点

目次

C言語のstrcpy関数とは?

C言語のstrcpy関数は、文字列をあるメモリ領域から別のメモリ領域へコピーするために使う標準ライブラリ関数です。この関数は「string.h」ヘッダファイルに定義されています。「string.h」は、文字列操作のライブラリです。strcpy関数はそのなかで、文字列を扱う際に最も基本的かつ頻繁に使用される関数の一つになります。

strcpy関数は、プログラム内でソース文字列の内容を終端のNULL文字('\0')も含めてコピーします。C言語のなかで文字列は、単なるchar型の配列として扱われます。その終端は常にNULL文字であるため、strcpy関数では、このNULL文字を見つけるまでコピーを続ける形です。

ただしstrcpy関数には、バッファオーバーフローという大きなリスクがあります。

コピー先のバッファサイズがソース文字列よりも小さい場合、メモリの境界を超えた書き込みが発生します。バッファオーバーフローは、プログラムの異常動作やセキュリティ脆弱性の原因となるものです。

そのため、実際のアプリケーション開発では、strncpy関数やstrlcpy関数などの安全な代替手段が好まれることが多くなっています。

strcpy関数を適切に使うためには、コピー先のバッファサイズを常に意識し、十分な領域が確保されていることを確認する必要があります。この記事では、strcpy関数の基本的な使い方から、安全に利用するためのテクニックまでを詳しく解説していきましょう。

【関連】
C言語をもっと詳しく学ぶならpaizaラーニング

基本構文

strcpy関数はstring.hヘッダファイルで定義されており、文字列を一つの配列から別の配列へコピーするために使用します。構文はシンプルです。コピー先とコピー元の2つの引数をとる形になります。

#include <stdio.h> #include <string.h> int main() { char src[] = "dog", dst[10]; strcpy(dst, src); printf("%s\n", dst); }

出力結果:

dog

実用例

このセクションでは、プログラム初心者でもイメージしやすい動物の例を用いながら、strcpy関数の基本的な使い方やコードパターン、出力結果を紹介しましょう。

これから示すコードパターンは、アプリケーション開発における基礎となるものです。また、strcpy関数にはバッファオーバーフローというリスクもあることから、その対策やポイントもわかりやすく解説していきます。

strcpy関数の理解を深めるうえで重要となるのは、コードを自分のプログラムに実装してみる「経験」です。

必要に応じたコードのアレンジやコンパイルなどを行なうと、初心者には難しいエラーなどに直面するなかで、適切な関数やテクニックを選択する思考力や応用力も次第に身に付いてくるはずです。

最初のうちは、難しいエラーの対処で困惑することもあるかもしれません。しかし、失敗を恐れず多くの経験を積む姿勢は、C言語プログラミング力の向上に欠かせないものでしょう。

基本的な文字列コピー

以下のコードパターンは、strcpy関数の最も基本的な使い方です。ある文字列を別の配列にコピーします。以下のコード例はとてもシンプルですが、文字列処理の基礎となる操作です。必ず覚えておきましょう。

strcpy関数を安全に使うためには、コピー先配列のサイズがソース文字列を格納できるだけの十分なサイズであることが重要です。サイズが小さい場合、バッファオーバーフローが発生します。

#include <stdio.h> #include <string.h> int main() { char src[] = "cat", dst[5]; strcpy(dst, src); printf("%s\n", dst); }

出力結果:

cat

バッファサイズ管理による安全なコピー

strcpy関数を安全に使うためにも、コピー先バッファサイズを必ず確認しましょう。以下のコードパターンでは、sizeof演算子とstrlen関数を使い、コピー前にバッファが十分な大きさであるかをチェックしています。sizeofは、変数の型やメモリサイズを調べるための演算子です。実際のアプリケーション開発をする際には、このような安全対策が必要不可欠でしょう。

#include <stdio.h> #include <string.h> int main() { char src[] = "cat", dst[10]; if (sizeof(dst) > strlen(src)) strcpy(dst, src); printf("%s\n", dst); }

出力結果:

cat

文字列の一部のみをコピー

ポインタ演算を使い、文字列の特定部分だけをコピーする例です。このテクニックは、長い文字列から必要部分だけを抽出したい場合に役立つものとなります。開始位置を指定して、そこから終端のNULL文字までをコピーする動きです。

#include <stdio.h> #include <string.h> int main() { char text[] = "dog and cat"; char dst[10]; strcpy(dst, text + 8); // "cat"の位置からコピー printf("%s\n", dst); }

出力結果:

cat

複数の文字列を連結してコピー

strcpy関数とstrcat関数を組み合わせて、複数の文字列を一つにまとめる例です。strcpy関数で最初の文字列をコピーしたうえで、strcat関数で追加していきます。この組み合わせは、文字列の結合や、複数のパーツから一つのメッセージを作成するうえで役立つでしょう。

#include <stdio.h> #include <string.h> int main() { char dst[15]; strcpy(dst, "dog"); strcat(dst, " and cat"); printf("%s\n", dst); }

出力結果:

dog and cat

入力検証と組み合わせた安全なコピー

入力データの検証を行ってから、安全にコピーする例です。この例では空の入力文字列の場合はデフォルト値を使用しています。実際のアプリケーションでは、ユーザー入力やファイルから読み込んだデータの検証は非常に重要です。

#include <stdio.h> #include <string.h> int main() { char input[] = "", animal[10]; strcpy(animal, strlen(input) ? input : "rabbit"); printf("%s\n", animal); }

出力結果:

rabbit

動的メモリ確保とstrcpyの組み合わせ

mallocで動的にメモリを確保し、strcpyでそこに文字列をコピーする例です。この方法は必要なサイズだけメモリを確保できるため効率的です。ただし使用後は、必ずfree()でメモリ解放することが重要となります。

#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char *src = "turtle", *dst = malloc(strlen(src) + 1); strcpy(dst, src); printf("%s\n", dst); free(dst); }

出力結果:

turtle

多次元配列での活用

文字列の配列(多次元配列)でstrcpy関数を使う際のコードパターンです。以下の例では複数の動物名を配列の各要素にコピーしています。バッファオーバーフローを起こさないためにも、各要素が十分なサイズであることの確認が必要です。このテクニックは、データベースのような情報を扱う際にも役立つものでしょう。

#include <stdio.h> #include <string.h> int main() { char animals[2][10]; strcpy(animals[0], "dog"); strcpy(animals[1], "cat"); printf("%s、%s\n", animals[0], animals[1]); }

出力結果:

dog、cat

構造体メンバーへの文字列コピー

構造体のメンバーに、文字列をコピーする際のコードパターンです。このテクニックは関連データをまとめる際に便利であり、ユーザー情報や設定情報の管理をするうえで特に役立ちます。バッファオーバーフローを防ぐために、各メンバーのサイズが十分であることを確認しましょう。

#include <stdio.h> #include <string.h> struct Pet { char name[10], type[10]; }; int main() { struct Pet pet; strcpy(pet.name, "Pochi"); strcpy(pet.type, "Dog"); printf("%s(%s)\n", pet.name, pet.type); }

出力結果:

Pochi(Dog)

まとめ

C言語のstrcpy関数は、C言語の文字列処理において基本的かつ重要な関数です。

strcpy関数の代表的な機能は、コピー元の文字列をコピー先のバッファに複製するという単純なものです。ただし、strcpy関数によるコピーには、バッファオーバーフローのリスクがあります。strcpy関数を安全に使うためには、常にコピー先バッファのサイズを確認し、十分な領域が確保されていることを確認する習慣が必要でしょう。

より安全なコードを書くためには、strncpyやstrlcpyなどの代替関数を検討することも重要です。これらの関数には、コピーするバイト数を制限できる特徴があります。バッファオーバーフローを防ぐうえで、とても役立つものでしょう。

文字列操作は、プログラミングにおいてとてもよく使われるテクニックです。そこでstrcpy関数の適切な使用法を理解すると、効率的かつ安全なコードを書くスキルが向上します。メモリ管理に注意を払いながら、この記事で紹介した実用例をベースに、自分のプログラムでstrcpy関数を活用してみてください。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. C言語のリファレンス記事一覧
  4. C言語 strcpyの使い方