<戻る  目次  進む>  
          <戻 進> 雑誌 白黒 明暗   フォント 既定 ゴシック 明朝 手書き   サイズ   標準  


   文字列処理関数   

  1. 第1項:数値への変換
  2. 第2項:文字列のコピー
  3. 第3項:文字列の連結
  4. 第4項:究極の文字列合成関数
  5. 第5項:文字列の入力
  6. 第6項:文字数を数える
  7. 第7項:文字列の比較

[1]数値への変換

C言語には、文字列を処理するための様々な関数が用意されています。
それらをうまく使うことで、文字列を自由に処理できます。

atoi関数は、文字列を数値に変換した結果を変数に代入します。
atoi関数の使い方は次の通りです。
なお、atoi関数を使うには、stdlib.h を #include する必要があります。


変数 = atoi(文字列配列名);
次のプログラムは、atoi関数を使って数値を変換する例です。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char str[] = "145";
  int suuti = atoi(str);
  printf("%d\n",suuti);
  return 0;
}
このプログラムの実行結果は次の通りになります。

145
atoi関数では、+-の付いた符号付きの数字も変換できます。
もし、数字とは関係ない文字列が指定された場合は、0に変換されます。
実数に変換する場合には、atof関数を使用します。使い方は同じです。

目次に戻る


[2]文字列のコピー

strcpy関数を使うと、文字列のコピーを行うことが出来ます。
strcpy関数の使い方は次の通りです。
なお、strcpy関数を使うには、string.h を #include する必要があります。

strcpy(コピー先文字列配列名,コピー元文字列配列名);
この関数は、文字列配列同士のコピーに使うのが元々の役目なのですが、
実際には、文字列の代入に使われることが多いようです。
次のプログラムは、strcpy関数を使って文字列を代入する例です。

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[10];
	strcpy(str,"MARIO");
	printf("%s\n",str);
	return 0;
}
このプログラムの実行結果は次の通りになります。

MARIO
前章の最後で、1つずつ代入する方法を説明しましたが、こちらのほうが簡単です。

さらに、先頭から指定された文字数だけをコピーするstrncpy関数もあります。
strncpy関数の使い方は次の通りです。


strncpy(コピー先文字列配列名,コピー元文字列配列名,コピーする文字数);
この関数は、文字数の分だけコピーするだけなので、
場合によっては、コピーされた文字列の最後にEOSが入っていないことがあります。
そのまま表示させると延々と表示され続けるので、必ずEOSを付けます。

strncpy(コピー先文字列配列名,コピー元文字列配列名,コピーする文字数);
コピー先文字列配列名[コピーする文字数] = '\0';
次のプログラムは、文字列の先頭から3文字を取り出して表示する例です。

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str1[] = "MARIO",str2[10];
	strncpy(str2,str1,3);
	str2[3] = '\0';	/* EOSを付加 */
	printf("%s\n",str2);
	return 0;
}
このプログラムの実行結果は次の通りになります。

MAR

[  strncpyは危険  ]
strncpy関数では必ずEOSを付けなくてはならないのですが、
それを忘れてしまいそうな人は、EOSを付ける関数を作るべきです。
なお、配列を関数に渡す方法は後に説明します。

目次に戻る


[3]文字列の連結

文字列リテラルを連結するだけなら関数は必要ありません。
文字列リテラルをただ並べるだけで連結されるからです。
次のプログラムは、文字列リテラルの連結を行う例です。

#include <stdio.h>
int main(void)
{
	char str[] = "DRAGON" "QUEST";
	printf("%s\n",str);
	return 0;
}
このプログラムの実行結果は次の通りになります。

DRAGONQUEST
DRAGON と QUEST が連結されていることがわかると思います。

ただし、配列に記憶された文字列を連結する場合には、配列名を並べても駄目です。
その場合はstrcat関数を使います。strcat関数の使い方は次の通りです。
なお、strcat関数を使うには、string.h を #include する必要があります。


strcat(元の文字列が記憶された配列,追加する文字列の記憶された配列);
次のプログラムは、strcat関数を使って文字列を連結する例です。

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str1[12] = "DRAGON";
	char str2[] = "QUEST";
	strcat(str1,str2);
	printf("%s\n",str1);
	return 0;
}
このプログラムの実行結果は次の通りになります。

DRAGONQUEST
この関数を使う時に注意してほしいのは、元の文字列が記憶された配列は、
元の文字列+追加する文字列だけの大きさが必要になることです。
少ない要素数の文字配列に無理矢理詰め込むと暴走につながります。

目次に戻る


[4]究極の文字列合成関数

ここで、究極の文字列合成関数を紹介したいと思います。
筆者が調べた限りではほとんどの入門書ではこの関数が紹介されていないのですが、
この関数はあらゆる文字列合成に使用できる万能関数なので是非覚えるべきです。

sprintf関数は、printf関数と同じ機能を持った関数ですが、
sprintf関数の場合、結果を配列の中に記憶します。
printf関数の様々な機能を自由に取り扱うことが出来るのです。

sprintf関数の使い方は次の通りです。
なお、sprintf関数を使うには、stdio.h を #include する必要があります。


sprintf(結果を記憶する配列,書式文字列,各種変数・・・);
次のプログラムは、sprintf関数を使う例です。

#include <stdio.h>

int main(void)
{
	char str[16];
	char str1[12] = "DRAGON";
	char str2[] = "QUEST";
	int i = 3;
	sprintf(str,"%s%s%d\n",str1,str2,i);
	printf(str);
	return 0;
}
このプログラムの実行結果は次の通りになります。

DRAGONQUEST3
この関数を使えば、ほとんどの文字列合成が実現できます。

[  直に文字配列  ]
先ほどのプログラムでは文字列の表示に、

printf(str);
と、%s指定子を使用せずに直接文字配列 str を渡しています。
そもそも printf関数は文字列を表示する関数なので、
わざわざ %s指定子を使わなくても表示できるのです。
ただし、文字列中に % が含まれていると、
出力変換指定子と誤解して誤動作するので、その時は %s を用います。

目次に戻る


[5]文字列の入力

数値と同様、文字列を入力する場合にもscanf関数を使うことが出来ます。
文字列を入力する場合、scanf関数で%s指定子を指定します。
ただし、配列名の前に&を付けません

次のプログラムは、入力した文字列をそのまま表示する例です。


#include <stdio.h>

int main(void)
{
	char str[32];
	scanf("%s",str);
	printf("%s\n",str);
	return 0;
}
このプログラムの実行結果は、次の通りになります。

MARIO キーボードから入力した文字列
MARIO
これで、自由に文字列を入力することが出来ますが、注意点があります。

1つ目は、配列の要素数よりも多く入力すると暴走してしまうことです。
これが、第6章でも説明した入力ミスの恐怖なのです。

この問題を解決するには、文字配列の要素数を%とsの間で指定します。
例えば、要素数が32の場合は%32sと指定すると、それ以上の文字は切り捨てられます。
次のプログラムは、文字列の切り捨ての例です。


#include <stdio.h>

int main(void)
{
	char str[32];
	scanf("%32s",str);
	printf("%s\n",str);
	return 0;
}
このプログラムの実行結果は、次の通りになります。

0123456789012345678901234567890123456789 キーボードから入力した文字列
01234567890123456789012345678901
文字列は途中までですが、暴走は防がれており、安全になっています。

2つ目は、この方法では、スペースを入力できないことです。
これは、スペースが区切り記号として認識されるためです。
残念ながら、こちらの解決は困難です。

目次に戻る


[6]文字数を数える

文字列の数を数えるのは難しいことではありません。
文字配列の先頭からEOSが出現するまでの数を数えるだけのことです。
次のプログラムは、入力された文字列の数を表示する例です。

#include <stdio.h>

int main(void)
{
	int i;
	
	char str[256];
	scanf("%s",str);
	
	for (i = 0;str[i] != '\0';i++);

	printf("%d\n",i);
	
	return 0;
}
このプログラムの実行結果は、次の通りになります。

ABCDEF キーボードから入力した文字列
6
for文の意味が少しわかりにくいかも知れませんが、
配列要素の中にEOSが出現するまで変数iをひたすら増加させているだけです。

ただ、文字列の文字数を数えるために毎回for文を書くのは面倒です。
そのため、文字列の文字数を数えるstrlen関数が用意されています。
なお、strlen関数を使うには、string.h を #include する必要があります。


変数 = strlen(文字配列);
次のプログラムは、先ほどのプログラムをstrlen関数で書き直した例です。

#include <stdio.h>
#include <string.h>

int main(void)
{
	int i;
	
	char str[256];
	scanf("%s",str);
	
	i = strlen(str);
	
	printf("%d\n",i);
	
	return 0;
}
実行結果は先ほどと同じになります。

目次に戻る


[7]文字列の比較

文字配列の内容が同じかを比較する場合、次のようなプログラムを考えると思います。


str1 == str2;
しかし、文字配列同士の比較では==演算子を使うことは出来ません
具体的な理由は次章で明らかになりますが、ここで簡単に説明をしておくと、
この例では配列が全く同じ(同じメモリを使う)配列なのかを比較しているのであり、
配列の中身が同じかどうかを比較しているわけではないためです。

文字配列の中身を比較するにはfor文で全要素を比較する必要があります。
次のプログラムは、入力された文字列が DRAGONQUEST であるかどうかを比較する例です。


#include <stdio.h>
#include <string.h>

int main(void)
{
	int len,i;
	char str1[256],str2[] = "DRAGONQUEST";
	
	scanf("%s",str1);
	
	len = strlen(str2);
	
	for (i = 0;i < len + 1;i++) {
		if (str1[i] != str2[i]) break;
	}

	if (i == len + 1) {
		printf("同じ\n");
	} else {
		printf("違う\n"); 
	}
	
	return 0;
}
このプログラムの実行結果は、次の通りになります。

DRAGONQUEST キーボードから入力した文字列
同じ

ABCDEF キーボードから入力した文字列
違う

DRAGONQUEST3 キーボードから入力した文字列
違う
文字列の比較ではEOSまでが同じでなければならないため、
比較元の文字数よりも1文字大きく比較しています。

ただ、文字列を比較するために毎回for文を書くのは面倒です。
そのため、文字列を比較するstrcmp関数が用意されています。
なお、strcmp関数を使うには、string.h を #include する必要があります。


変数 = strcmp(文字配列1,文字配列2);
この関数は、2つの文字配列の中身が同じである場合には0を返します。
次のプログラムは、先ほどのプログラムをstrcmp関数で書き直した例です。

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str1[256],str2[] = "DRAGONQUEST";
	
	scanf("%s",str1);
		
	if (strcmp(str1,str2) == 0) {
		printf("同じ\n");
	} else {
		printf("違う\n"); 
	}
	
	return 0;
}
実行結果は先ほどと同じになります。

目次に戻る


<−前に戻る  先頭に戻る  次へ進む−>