様々な文字列関数
文字列再び
すでに学んだように、C言語で文字列を扱う場合、char型の配列変数を使います(基本編5日目参照)。C言語には文字列を操作する様々な関数が存在します。ここではそういった関数と使い方を紹介していきます。
サンプロプログラム
まずは、以下のサンプルを実行してみてください。
listex4-1:main.c(文字列のコピーと結合)#include <stdio.h> #include <string.h> void main(){ char s[10]; int len; // 文字列のコピー strcpy(s,"ABC"); printf("s=%s¥n",s); // 文字列の結合 strcat(s,"DEF"); printf("s=%s¥n",s); // 文字列の長さ len = strlen(s); printf("文字列の長さ:%d¥n",len); }
s=ABCDEF
文字列の長さ:6
文字列の結合とコピー
まずは、文字列の結合とコピーの関数を見てみましょう。使用されている関数は以下のとおりです。(表4-1)
関数 | 書式 | 意味 | 使用例 |
---|---|---|---|
strcpy() | strcpy(char* s1,char* s2); | 右辺の文字列を左辺の文字列変数にコピーする。 | strcpy(s,"Hello"); |
strcat() | strcat(char* s1,char* s2); | 右辺の文字列を左辺の文字列変数に追加する。 | strcat(s,"World"); |
8行目で、strcpy()文字列変数sに対して、"ABC"という文字列をコピーしています(図4-1①)。その後、同じ変数に11行目でstrcat()関数を用いて"DEF" という文字列を追加しているので、最終的にsに入っている文字列は、"ABCDEF"となります。(図4-1②)
文字列の長さ
続いて、文字列の長さをstrlen()関数を用いて取得しています。strlen関数は、以下のような処理をする関数です。(表4-2)
関数 | 書式 | 意味 | 使用例 |
---|---|---|---|
strlen() | strlen(char* s); | ()に文字列を与えると、戻り値として長さを得られる。 | int l = strlen("Hello"); |
文字列の長さとは、char型の配列の0番の文字から、最後に'¥0'にたどり着くまでに入っている文字の数を指します。
文字列の比較
次は、文字列通しを比較する関数を見てみましょう。まずは、以下のプログラムを実行してみてください。
listex4-2:main.c#include <stdio.h> #include <string.h> void main(){ char s1[256],s2[256]; printf("s1="); scanf("%s",s1); printf("s2="); scanf("%s",s2); if(strcmp(s1,s2)==0){ printf("s1とs2は等しい¥n"); }else{ printf("s1とs2は等しくない¥n"); } }
s2=ABC
s1とs2は等しい
s2=DEF
s1とs2は等しくない
プログラムを実行すると、コマンドプロンプトが出て、文字列を入力するように要求してきます。これを二回繰り返して、s1,s2に文字列を代入します。 そして、最終的に、s1とs2が同じ文字列であれば、「s1とs2は等しい」そうでなければ「s1とs2は等しくない」と表示します。
文字列の比較は、strcmp()関数を用います。概要は以下のとおりです。(表4-3)
関数 | 書式 | 意味 | 使用例 |
---|---|---|---|
strcmp() | strcpy(char* s1,char* s2); | 文字列s1,s2が等しいと0、 等しくなければそれ以外の値を返す。 | if(strcmp(s,"Hello")==0) |
数値・文字列の変換
文字列から数値への変換
続いては、数値と文字列の変換をみてみましょう。まずは、文字列を数値に変換するパターンから見てみましょう。
listex4-3:main.c#include <stdio.h> #include <stdlib.h> void main(){ char s1[] = "1000"; char s2[] = "12.345"; int a; double b; a = atoi(s1); b = atof(s2); printf("a=%d b=%f¥n",a,b); }
実行結果から判るように、文字列として与えられた数値が、それぞれ整数(int)・実数(double)として取得できました。ここで使用している関数は以下のとおりです。(表4-4)
関数 | 書式 | 意味 | 使用例 |
---|---|---|---|
atoi() | atoi(char* s); | 与えられた文字列を整数(int)に変える。 | int n = atoi("100"); |
atof() | atof(char* s); | 与えられた文字列を実数(double)に変える。 | double d = atof("3.14"); |
数値から文字列の変換
今度は逆に、数値から文字列を作ってみましょう。このときに用いることが出来るのは、sprintf()関数です。以下のサンプルを実行してみてください。
listex4-4:main.c#include <stdio.h> #include <string.h> void main(){ char s1[256],s2[256]; int a = 100,b = 200; sprintf(s1,"%d",a); sprintf(s2,"bの値は%dです。",b); puts(s1); puts(s2); }
bの値は200です。
sprintf()関数は、printf()と同じ要領で文字列を作成できる非常に便利な関数です。例えば、sをcharの配列とすると
sprintf()の使用例とすると、sには、"HelloWorld"という文字列が入ります。同様にして、7行目の処理を行えば、s1には、"100"という文字列が入ります。 また、8行目のように、数値を含む文字列も容易に作ることが可能です。
なお、文字列を操作する関数ではないのですが、9行目、10行目に出ているputs()関数は、()に入った文字列を表示し、改行する関数です。例えば
puts()の使用例とすれば、「HelloWorld」と表示されて、改行されます。printf()の場合は、改行する場合はあえて'¥n'を最後に入れる必要がありましたが、puts()関数にはその必要がありません。
文字列関数における注意点
文字列の長さと配列の大きさ
以上がC言語で用いられる主要な文字列関数です。ただ、文字列関数を用いるとき、特に、何らかの文字列を新たに生成する時には注意が必要です。
例えば、文字列の配列のサイズが10しかないのに、それ以上の長さの文字列を代入することはできません。このような場合、 コンパイル時にエラーは出ませんが、実行時にシステムが以上終了するなどといったことが起こるので、気をつけましょう。(図4-2)