サイトマップ / C言語講座出入り口総目次目次:ポインタ>文字列を比較

青い直線

文字列を比較

青い直線

[文字列の長さ]←このソース→[特定の文字の現れる位置]

/* ソースプログラムの説明

二つの文字列s1とs2を辞書的に比較し、もし、s1の方が辞書でいうと前の方に出てくるならマイナスの値を、等しければ0を、後ろに出てくるならプラスの値を返す関数、StrCmpare( )を作ります。

引数は2つあり、文字列s1とs2へのポインタです。文字列を書き変えてはいけないので、いずれもconstを付けます

二つのポインタは、最初は文字列の先頭を指しています。ループの中で、ポインタの指す中身を比較して、もし異なっていたらループから抜けて、2つの文字の値の差を返して関数を終了します。

もしポインタの指す中身が等しく、それが文字列の末尾の'\0'であるなら、調べた全ての文字が等しかったことになり、2つの文字列は等しいので、0を返して関数から抜けます。'\0'でないならまだ文字列の途中なので、ポインタをそれぞれインクリメントしてループを続けます。これをコーディングしたのが、案1です。

    案1
    int  StrCmpare(const char *s1, const char *s2)
    {
        while (*s1 == *s2) {
            if (*s1 == '\0')
                return (0);
            s1++;
            s2++;
        }
        return (*s1 - *s2);
    }

アルファベットには大文字と小文字があります。案1は大文字と小文字を区別します。アスキーコード表を見て下さい。ない方はブラウザの検索機能を使って調べて下さい。大文字の方が先に出てきます。'XYZ'に続いて'[\]^_ 'などが出てきて、1字空けて小文字のアルファベットが続きます。

  1. 'A'の値は16進表現で0X41です。
  2. 'a'の値16進表現で0X61です。
  3. 'a' - 'A'は0X20になります。
  1. 大文字と小文字は0X20離れています。
  2. 大文字を小文字に変換するには、その文字の値に0X20を加えて下さい。
  3. 小文字を大文字に変換するには、逆に0X20を引いて下さい。

なお、アスキーコードが変更される可能性はほとんどないとはいえ、0X20という値を直接使うのではなく、'a' - 'A'とした方が良いと思います。

アルファベットの大文字を小文字に変換する関数を下記に示します。説明はソースプログラムの中にあります。

    char ToLower(char c)
    {
        if (c >= 'A' && c <= 'Z')
            return (c + 'a' - 'A');
        else
            return (c);
    }

ソースプログラムでは文字列の大文字と小文字を区別しないで、二つの文字列を比較します。 */

/* ここからソースプログラム */

#include  <stdio.h>

char ToLower(char c);
int  StrCmpare(const char *s1, const char *s2);
void main (void);

  /* もし英大文字なら小文字に変換 */
char ToLower(char c)
{
    if ( c >= 'A' && c <= 'Z' )    /* もし大文字なら */
        return (c + 'a' - 'A');    /* 小文字に変換 */
    else                           /* 小文字ならそのままリターン */
        return (c);
}

  /* 文字列を辞書的に比較 */
int StrCmpare(const char *s1, const char *s2)
{
    while (ToLower(*s1) == ToLower(*s2)) {  /* 文字が等い間ループする */
        if (*s1 == '\0')                    /* 末尾まで等しければ */
            return (0);                     /* 0を返す */
        s1++;                               /* 文字列の途中なので */
        s2++;                               /* インクリメントする */
    }    /* 等しくないので文字の値の差を返す */
    return (ToLower(*s1) - ToLower(*s2));
}

void main(void)
{
    char s1[ ] = "ABCDEF";
    char s2[ ] = "aBcDeF";

    printf("'a' - 'A' = 0X%X\n",  'a' - 'A');    /* 'a'と'A'の差を16進数で表示 */

    printf("s1[ ]:%s\n", s1);
    printf("s2[ ]:%s\n", s2);
	
    printf("%s\n", !StrCmpare(s1, s2)? "s1[ ] = s2[ ]":"s1[ ] <> s2[ ]");
}

/* ここまでソースプログラム */

/* 最後の printf( )のカッコの中で、3項演算子が使われています。

    !StrCmpare(  )は頭に'!'が付いているので、
     StrCmpare(  )が0の時、即ち、2つの文字列が等しければ真となり、
     "s1[ ] = s2[ ]"が表示され、
    偽なら、"s1[ ] <> s2[ ]"が表示されます。

ToLower( )と同等の関数が標準ライブラリ関数にあります。

    #include  <ctype.h>
    char tolower(char c);

    例:tolower(c);

    戻り値
        大文字であれば小文字に変換して、
        そうでなければcをそのまま返す

StrCmpare( )と同等の関数が標準ライブラリ関数にあります。

    #include  <string.h>
    int strcmp(const char *s, const char *t);

    例:strcmp(s, t);

    戻り値
        s > t の時正の値
        s = t の時0
        s  < t の時負の値

*/

[文字列の長さ]←このソース→[特定の文字の現れる位置]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>文字列を比較