様々な文字列関数

文字列再び

すでに学んだように、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=ABC
s=ABCDEF
文字列の長さ:6

文字列の結合とコピー

まずは、文字列の結合とコピーの関数を見てみましょう。使用されている関数は以下のとおりです。(表4-1)

表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②)

図4-1.strcpy(),strcat()の処理
strcpy(),strcat()の処理

文字列の長さ

続いて、文字列の長さをstrlen()関数を用いて取得しています。strlen関数は、以下のような処理をする関数です。(表4-2)

表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");
   }
}
実行結果①(入力した値が同じ場合)
s1=ABC
s2=ABC
s1とs2は等しい
実行結果②(入力した値が違う場合)
s1=ABC
s2=DEF
s1とs2は等しくない

プログラムを実行すると、コマンドプロンプトが出て、文字列を入力するように要求してきます。これを二回繰り返して、s1,s2に文字列を代入します。 そして、最終的に、s1とs2が同じ文字列であれば、「s1とs2は等しい」そうでなければ「s1とs2は等しくない」と表示します。

文字列の比較は、strcmp()関数を用います。概要は以下のとおりです。(表4-3)

表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);
}
実行結果
a=1000 b=12.345

実行結果から判るように、文字列として与えられた数値が、それぞれ整数(int)・実数(double)として取得できました。ここで使用している関数は以下のとおりです。(表4-4)

表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);
}
実行結果
100
bの値は200です。

sprintf()関数は、printf()と同じ要領で文字列を作成できる非常に便利な関数です。例えば、sをcharの配列とすると

sprintf()の使用例
printf(s,"HelloWorld");

とすると、sには、"HelloWorld"という文字列が入ります。同様にして、7行目の処理を行えば、s1には、"100"という文字列が入ります。 また、8行目のように、数値を含む文字列も容易に作ることが可能です。

なお、文字列を操作する関数ではないのですが、9行目、10行目に出ているputs()関数は、()に入った文字列を表示し、改行する関数です。例えば

puts()の使用例
puts("HelloWorld");

とすれば、「HelloWorld」と表示されて、改行されます。printf()の場合は、改行する場合はあえて'¥n'を最後に入れる必要がありましたが、puts()関数にはその必要がありません。

文字列関数における注意点

文字列の長さと配列の大きさ

以上がC言語で用いられる主要な文字列関数です。ただ、文字列関数を用いるとき、特に、何らかの文字列を新たに生成する時には注意が必要です。

例えば、文字列の配列のサイズが10しかないのに、それ以上の長さの文字列を代入することはできません。このような場合、 コンパイル時にエラーは出ませんが、実行時にシステムが以上終了するなどといったことが起こるので、気をつけましょう。(図4-2)

図4-2.配列から文字列がオーバーしないように注意が必要
配列から文字列がオーバーしないように注意が必要