C++で文字列をコピーする方法:strcpy()を使う場合と使わない場合のプログラム解説
文字列(string)とは、null文字('\0')で終端される1次元のchar型配列のことです。ある文字列の値を別の文字列にコピーすることができます。コピーの方法には、標準ライブラリ関数であるstrcpy()を使用する方法と、使用せずに自前で処理する方法の2通りがあります。
strcpy()を使わずに文字列をコピーするプログラム
まずは、標準ライブラリに頼らず、forループを使って1文字ずつコピーする方法を見てみましょう。
#include <iostream>
using namespace std;
int main() {
char str1[100] = "Magic";
char str2[100];
int i;
for(i = 0; str1[i] != '\0'; i++)
str2[i] = str1[i];
str2[i] = '\0';
cout<<"The contents of str2 are: "<<str2;
return 0;
}出力結果
The contents of str2 are: Magic
上記のプログラムでは、forループを使ってstr1の内容をstr2へコピーしています。ループはインデックス0から開始し、str1内のnull文字('\0')に到達するまで繰り返されます。
ループが終了した時点で変数iはnull文字の位置を指しているため、その位置に改めて'\0'を代入することで、str2も正しく終端された文字列になります。最後にcoutでstr2の内容を表示しています。該当するコード部分は以下の通りです。
for(i = 0; str1[i] != '\0'; i++) str2[i] = str1[i]; str2[i] = '\0'; cout<<"The contents of str2 are: "<<str2;
strcpy()関数を使って文字列をコピーするプログラム
次に、標準ライブラリのstrcpy()関数を使用する方法です。この関数は<cstring>ヘッダに宣言されているため、インクルードが必要です。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char str1[100] = "Magic";
char str2[100];
strcpy(str2,str1);
cout<<"The contents of str2 are: "<<str2;
return 0;
}出力結果
The contents of str2 are: Magic
上記のプログラムでは、strcpy(str2, str1)とすることで、str1の内容(終端のnull文字を含む)がstr2へ一括してコピーされます。その後、str2の内容を表示しています。該当するコード部分は以下の通りです。
strcpy(str2,str1); cout<<"The contents of str2 are: "<<str2;
まとめ
手動でのコピーは動作の仕組みを理解するのに適しており、strcpy()を使えばコードを簡潔に書けます。なお、実務ではコピー先バッファのサイズを超える書き込みを防ぐために、サイズ指定可能なstrncpy()やC++のstd::stringを利用することも検討するとよいでしょう。
-
C++で2つの2進数文字列を加算するプログラムの書き方
2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁
-
C++プログラムにおける二分探索(バイナリサーチ)の基本と実装
二分探索(バイナリサーチ)とは二分探索は「半区間探索」「対数探索」「バイナリチョップ」とも呼ばれる検索アルゴリズムで、ソート済みの配列の中から目的の値が存在する位置を効率的に見つけ出します。基本的な仕組みは非常にシンプルです。まず、探したい値(ターゲット値)を配列の中央の要素と比較します。一致しなかった場合は、ターゲット値が存在し得ない半分を丸ごと排除し、残りの半分に対して同様の比較を繰り返します。この「中央との比較」と「範囲の絞り込み」を続け、ターゲット値が見つかるか、検索範囲が空になる(=配列にその値が存在しない)かのどちらかで処理が終了します。アイデア自体は簡単ですが、正しく実装するには