Ruby言語では文字列を、コピーしたり、くっつけたり(結合)、
一部分(部分文字列; substring)を取り出したりすることがいとも簡単にできた。
C言語は文字列を操作する場合には、つねに char
型配列 で
あることを意識し、コピーするときも結合するときも必要な
char
型配列を宣言して行なう必要がある。
実用的なプログラムを作る場合には欠かせない文字列操作関数に 絞っていくつか挙げておこう。以下のいずれを利用する場合にも
#include <string.h>
が必要となることに注意する。
strlcpy
文字列をコピーする
strlcpy(コピー先, コピー元, 許容量)
とすると、コピー先の
許容量 を超えない範囲で
コピー元 が示す文字列を コピー先 の
char
型配列にコピーする。
例:
char new[100], old[]="Hello, world!";
のような場合、old[]
に入っている文字列を
new[]
にコピーしたい場合は、
strlcpy(new, old, sizeof new);
とする。
strcpy
文字列をコピーする。
strcpy(コピー先, コピー元)
許容量の指定がないことの他はstrlcpy
と同じ。
strcpy
は、文字列が壊れているとメモリを破壊するので実
際のプログラミングではstrlcpy
を使う。ただし、
プログラミングの参考書や試験ではstrcpy
を使う
ことが多い。
strlcat
文字列の結合を行なう
strlcat(文字列1, 文字列2, 許容量)
文字列2 を 文字列1 の末尾に追加する。
二つの文字列をつなげたいときに利用する。
例:
char new[100]="Hello", old[]=", world!";
のような場合に old[]
の文字列を
new[]
に安全に追加するには以下のようにする。
strlcat(new, old, sizeof new);
strcat
文字列の結合を行なう。許容量を指定しない点を除いて
strlcat
と同じ。プログラミングの参考書や試験では
strcat
を使う場合が多い。ただしchar
型配列のサイズが不足していると、他の変数の文字列を破壊する可能性が
ある。
例: test-strcat.c
#include <stdio.h> #include <string.h> int main() { char a[] = "a[]を追加するのだ。"; char b[] = "b[] だよ."; char c[] = "これは c[] です."; printf("aの内容=[%s]\n", a); printf("bの内容=[%s]\n", b); strcat(c, a); printf("aの内容=[%s]\n", a); printf("bの内容=[%s]\n", b); }
strcat
を利用する場合には宣言するchar
型配列のサイズに十分気をつける。もちろんstrlcat
を
利用する方が望ましい。
strncmp
文字列の大小比較を行なう。
strncmp(文字列1, 文字列2, 最大文字数)
として 文字列1 と 文字列2 の大小を
最大文字数 の範囲内で比較する。比較結果はint
型の数値で返る。
返す。
strcmp
文字列の大小比較を行なう。
strcmp(文字列1, 文字列2)
最大文字数の指定をしない他はstrncmp
と同じ。
strncasecmp
文字列の大小比較を行なう。
strncasecmp(文字列1, 文字列2, 最大文字数)
として 文字列1 と 文字列2 の大小を
最大文字数 の範囲内で比較する。比較のときには
アルファベットの大文字小文字を区別しない。比較結果はint
型の数値で返る。
strcasecmp
文字列の大小比較を大文字小文字の区別なしで行なう。
strcasecmp(文字列1, 文字列2)
最大文字数の指定をしない他はstrncasecmp
と同じ。
strstr
固定文字列によるパターンマッチ
strstr(BIG, LITTLE)
文字列 BIG の中に、文字列 LITTLE が 含まれるかどうか調べ、含まれる場合はBIG の中で 最初に LITTLE が見付かった先頭の位置をアドレスで返す。 見付からなかった場合は NULL を返す。
strcasestr
strcasestr(BIG, LITTLE)
大文字小文字を無視してstrstrを行なう。
strchr
strchr(文字列, 文字)
文字列 の中に 文字 があるか調べる。 見付かった場合は最初に見付かった位置をアドレスで返す。 見付からなかった場合は NULL を返す。
strrchr
strrchr(文字列, 文字)
文字列 の中に 文字 があるか 右側から(文字列 の後ろから)調べる。 見付かった場合は最初に見付かった位置をアドレスで返す。 見付からなかった場合は NULL を返す。