C言語-文字列処理 |
1.3 文字列処理関数 (2)
(関数strcmp)
入力した文字列がabcのときはGOOD、それ以外のときはERRORと表示する。[pro1-7.c]
#include <string.h> int strcmp(char *str1, char *str2); 文字列str1とstr2を比較する。一致すれば0、一致しなければ0以外を返す。 |
入力した文字列が配列buffに格納されているとき、if文で同じかどうかを判定する。
if(buff == "abc")
このようにif文を書けば良いと考えられるが、buffは配列名であり、配列名は配列の先頭アドレスである。また、文字列"abc"もabcが格納されたメモリの先頭アドレスになる。したがって、上のif文はアドレス同士を比較するものであって、文字列を比較することにはならない。
標準ライブラリには、文字列を比較する関数strcmpが用意されている。この関数を使用してif文を書くと次のようになる。
if(strcmp(buff, "abc") == 0)
printf("GOOD\n");
else
printf("ERROR\n");
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: |
#include <stdio.h> #include <string.h> int main(void) { char buff[256]; /* 入力文字列用 */ printf("文字列 : "); /* プロンプト表示 */ gets(buff); /* 文字列入力 */ if(!strcmp(buff, "abc")) /* 文字列比較 */ printf("GOOD\n"); /* 表示 */ else printf("ERROR\n"); /* 表示 */ return(0); } |
文字列 : abc GOOD |
文字列 : xyz ERROR |
【練習問題1-3】 入力した文字列がabcのときはGOOD、xyzのときはOK、それ以外のときはERRORと表示する。 [ren1-3.c]
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: |
#include <stdio.h> #include <string.h> int main(void) { char buff[256]; /* 入力文字列用 */ printf("文字列 : "); /* プロンプト表示 */ gets(buff); /* 文字列入力 */ if(@ ) printf("GOOD\n"); else if(A ) printf("OK\n"); B /* */ printf("ERROR\n"); return(0); } |
文字列 : abc GOOD |
文字列 : xyz OK |
文字列 : abz ERROR |
【練習問題1-4】 入力した文字列がabcかxyzのときはGOOD、それ以外のときはERRORと表示する。 [ren1-4.c]
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: |
#include <stdio.h> #include <string.h> int main(void) { char buff[256]; /* 入力文字列用 */ printf("文字列 : "); /* プロンプト表示 */ gets(buff); /* 文字列入力 */ if(@ ) printf("GOOD\n"); A /* */ printf("ERROR\n"); return(0); } |
文字列 : abc GOOD |
文字列 : xyz GOOD |
文字列 : abcd ERROR |
入力した文字列がreiのときはGOOD、endのときはプログラム終了、それ以外のときはERRORと表示する。ただし、endが入力されるまで繰り返し実行する。[pro1-8.c]
while(1){ 処理 }で処理全体を永久ループにする。endが入力されたときは、break文で永久ループを抜け出すことができる。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: |
#include <stdio.h> #include <string.h> int main(void) { char buff[256]; /* 入力文字列 */ while(1){ printf("文字列 : "); /* プロンプト表示 */ gets(buff); /* 文字列入力 */ if(!strcmp(buff, "abc")) /* 文字列比較 */ printf("GOOD\n"); /* 表示 */ else if(!strcmp(buff, "end")) /* 文字列比較 */ break; /* ループ脱出 */ else printf("ERROR\n"); /* 表示 */ } return(0); } |
文字列 : abc GOOD 文字列 : xyz ERROR 文字列 : end |
【練習問題1-5】 endが入力されるまでの文字列の文字数の合計を表示する。 [ren1-5.c]
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: |
#include <stdio.h> #include <string.h> int main(void) { char buff[256]; /* 入力文字列用 */ int len = 0; /* 文字数用 */ @ { printf("文字列 : "); /* プロンプト表示 */ gets(buff); /* 文字列入力 */ if(A ) break; else len = B ; } printf("文字数はC です\n", len); return(0); } |
文字列 : abcd 文字列 : efghij 文字列 : end 文字数は10です |
配列のサイズを大きくしている理由
これまで入力文字列用の配列のサイズは、大きめに設定してきた。これは設定した配列のサイズを超えて入力してもチェックなしに格納されるためである。例えば、次のようなプログラムのとき、
char moji[5];
gets(moji);
メモリには、上のように配置されたとする。
ここで、実行したときにabcdefと入力したとすると、配列のサイズ分の文字(abcde)が配列mojiの位置に格納されるのではなく、入力された文字のすべてが配列mojiの先頭から順に次の図のように格納される。
上の図からもわかるように、プログラムの領域にまで入力データがあふれている。プログラムが書き換えられ、暴走する危険がある。
したがって、文字列を格納する配列のサイズは、余裕を持たせる必要がある。次は2つの文字列を連結するので、配列のサイズには注意する必要がある。
Copyright © 2001 Hiroshi Masuda |