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

 11行目は、文字列が一致したときに0になり、0は条件式の偽を表すので、否定(!)を付けることで真になる。


【練習問題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

[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A   B
     

 

【練習問題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

[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A
     

 

入力した文字列がreiのときはGOOD、endのときはプログラム終了、それ以外のときはERRORと表示する。ただし、endが入力されるまで繰り返し実行する。[pro1-8.c]

 while(1){ 処理 }で処理全体を永久ループにする。endが入力されたときは、break文で永久ループを抜け出すことができる。

Break Continue


 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です

[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A   B   C
     



配列のサイズを大きくしている理由
 これまで入力文字列用の配列のサイズは、大きめに設定してきた。これは設定した配列のサイズを超えて入力してもチェックなしに格納されるためである。例えば、次のようなプログラムのとき、
char moji[5];
gets(moji);
Fig 1
メモリには、上のように配置されたとする。
 ここで、実行したときにabcdefと入力したとすると、配列のサイズ分の文字(abcde)が配列mojiの位置に格納されるのではなく、入力された文字のすべてが配列mojiの先頭から順に次の図のように格納される。
Fig 2
 上の図からもわかるように、プログラムの領域にまで入力データがあふれている。プログラムが書き換えられ、暴走する危険がある。
 したがって、文字列を格納する配列のサイズは、余裕を持たせる必要がある。次は2つの文字列を連結するので、配列のサイズには注意する必要がある。


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system