C では文字列は、文字の配列だ。最もよく使われる1次元配列は文字列だそうだ。文字列は1文字ずつ配列の要素に格納され、最後にヌル文字(0)がつく。
文字列に関する関数をいくつか見てみよう。
gets()
gets() はキーボードから文字列を読み取る。ユーザーが文字列に続いて Enter キーを押すと、gats() は改行文字をヌル文字に置き換えて返す。
#include int main(void) { char str[80]; int i; printf("Input string (less than 80).: "); gets(str); for (i = 0; str[i]; i++) { printf("%c", str[i]); } printf("\n"); return 0; }
takatoh@nightschool $ gcc sample_5_2a.c -o sample_5_2a sample_5_2a.c: In function ‘main’: sample_5_2a.c:10:5: warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations] gets(str); ^ /tmp/ccMGfyBh.o: 関数 `main' 内: sample_5_2a.c:(.text+0x2e): 警告: the `gets' function is dangerous and should not be used.
おっと、何やら警告が出た。gets は危険だから使うべきじゃない、と。まあ、そのとおりらしい。本には gets は文字の長さをチェックしないので受け入れる配列におさまるかどうかプログラマが注意しなければいけない、と書いてある。
コンパイル自体はできてるようだし、今回はサンプルなのでこのまま使うことにしよう。
takatoh@nightschool $ ./sample_5_2a Input string (less than 80).: Hello, this is Takatoh! Hello, this is Takatoh!
このプログラムでは、文字列終端のヌル文字が 0 (偽)であることを利用している。
strcpy()
文字列ソースをターゲットにコピーする。string.h が必要。
strcpy(ターゲット, ソース);
使い方はこんな感じ。
char str[80]; strcpy(str, "Hello, world."); printf("%s\n", str);
strcat()
文字列ターゲットにソースを連結する。string.h が必要。
strcar(ターゲット, ソース);
次のようにすると、「hello, threr」と表示する。
char str[80]; strcat(str, "hello,"); strcat(str, " there"); printf(str);
strcmp()
2つの文字列を比較する。string.h が必要。
strcmp(文字列1, 文字列2);
文字列はコード順に大きさを比較(コードが小さい方の文字列が小さいと判定される)され、文字列1と文字列2が同じ大きさなら 0 を返す。文字列1のほうが小さければ 0 より小さい値を、大きければ 0 より大きい値を返す。
strlen()
文字列の長さを返す。ヌル文字は含まれない。string.h が必要。
strlen(文字列);
練習問題
次のプログラムは、文字列を読み取り、それを逆の順序で表示する。
#include #include int main(void) { char str[80]; int i; printf("Input string (less than 80): "); gets(str); i = strlen(str); for ( ; i; i--) { printf("%c", str[i - 1]); } printf("\n"); return 0; }
takatoh@nightschool $ ./practice_5_2 Input string (less than 80): hello, world. .dlrow ,olleh