配列を使っているとfor文で列の長さ分だけループさせたい場合や、配列のコピーを作りたい場合があります。
それらの方法を解説します。
記事の内容
- 配列の長さ(要素数)を求める方法
- 配列をコピーする方法
配列の長さ(要素数)を求める方法
配列の長さ(要素数)分だけfor文を回したいときなどに配列の長さが必要になることがあります。
配列の長さを求める方法は主に以下の2つです。
sizeof演算子
sizeof演算子とは指定した変数や配列が何バイトなのかを出力します。
例:
#include <stdio.h> void main() { int num=1; int len=sizeof(num); printf("int length=%d\n",len); }
実行結果
int length=4
整数型の変数のサイズは4バイトなのでsizeof演算子を使って4という数字が得られました。
これを利用して配列の長さを求められます。
ただしsizeof(配列名)だけでは配列全体のバイト数しか得られません。
整数型で要素3つの配列であれば4×3=12バイトという数字になります。
そこで配列全体のバイト数をデータ型のバイト数で割ることで配列の要素数を求めます。
具体的にはsizeof(配列名)をsizeof(配列の0番目の要素)で割って算出します。
得られた値を使えば配列の要素数分だけ回るforループが作れます。
例:
#include <stdio.h> void main() { int num[]={1,2,3}; int len=sizeof(num)/sizeof(num[0]); //配列の長さ printf("array length=%d\n",len); for(int loop=0; loop<len; loop++) { printf("num[%d]=%d\n",loop,num[loop]); } }
実行結果
array length=3
num[0]=1
num[1]=2
num[2]=3
strlen関数(文字列のみ)
strlen関数は文字列の長さを測ってくれる関数です。
sizeof演算子より簡単に使えますが数字の配列には使えないので注意です。
引数に配列名を渡すと文字列の長さを返してくれます。
strlen関数はプログラムの先頭で「#include <string.h> 」と記述してから使います。
例:
#include <stdio.h> #include <string.h> void main() { char chara[6]="Hello"; int len=strlen(chara); printf("array length=%d\n",len); }
実行結果
array length=5
配列をコピーする方法
配列は変数のように「配列1=配列2」と書いてコピーすることはできません。
コピーするには以下の方法があります。
for文
for文で1つ1つの要素をコピーしていく方法です。
例:
#include <stdio.h> void main() { int num1[]={1,2,3}; //コピー元 int len=sizeof(num1)/sizeof(num1[0]); //num1のサイズ int num2[len]; //コピー先 for(int loop=0; loop<len; loop++) { num2[loop]=num1[loop]; printf("num2[%d]=%d\n",loop,num2[loop]); } }
実行結果
num2[0]=1
num2[1]=2
num2[2]=3
memcpy関数
配列を別の配列に丸ごとコピーするにはmemcpy関数が使えます。
プログラムの先頭で「#include <memory.h> 」と記述し、1つ目の引数にコピー先の配列、2つ目の引数にコピー元の配列、3つ目の引数にコピーしたいバイト数を渡して使います。
例:
#include <stdio.h> #include <memory.h> void main() { int num1[]={1,2,3}; int len=sizeof(num1)/sizeof(num1[0]); int num2[len]; memcpy(num2, num1, sizeof(num1)); for(int loop=0; loop<len; loop++) { printf("num2[%d]=%d\n",loop,num2[loop]); } }
実行結果
num2[0]=1
num2[1]=2
num2[2]=3
ただしmemcpy関数を使う際にはバッファオーバーフローに注意です。
上の例ではコピー先のnum2とコピーするバイト数sizeof(num1)のサイズが同じなので問題ありませんが、コピーするバイト数の方が大きい場合はコピー先のメモリ領域をはみ出して値をコピーしてしまうので注意です。
例えば以下のようにnum2の要素数が2つだったとすると別の変数などが使っているメモリ領域に意図せずnum1の値がコピーされてしまいます。
※1マスは4バイト分の領域
これをバッファオーバーフローといいます。
バッファオーバーフローが起きるとプログラムの意図しない動きやエラーの原因になります。
コンパイルエラーになりませんがwarningが出るので発見したら必ず直しておきましょう。
strcpy関数(文字列のみ)
strcpy関数は文字列を別の配列へコピーしてくれる関数です。
プログラムの先頭で「#include <string.h> 」と記述し、1つ目の引数にコピー先の配列、2つ目の引数にコピー元の配列を渡して使います。
例:
#include <stdio.h> #include <string.h> void main() { char chara1[6]="Hello"; char chara2[6]; strcpy(chara2, chara1); //chara2へchara1をコピー printf("chara2=%s",chara2); }
実行結果
chara2=Hello
strcpy関数を使う際にもバッファオーバーランに注意してください。
まとめ
配列はよく使われるため、便利な関数が用意されています。
用途に合わせてうまく活用してみてください。
C言語で行き詰まったら…
-
C言語・C++がわからない時に質問できるサイト・サービス5選
C言語を独学で勉強しているけど内容がイマイチわからない。もはや何がわからないのかもわからない。 C++のエラーが解決できない。ググってもわからない。わかる人に解説してほしい。 こんなお悩みにお答えしま ...
続きを見る