サイトマップ / C言語講座出入り口総目次目次:ポインタ>特定の文字の現れる位置

青い直線

特定の文字の現れる位置

青い直線

[文字列を比較]←このソース→[大文字小文字変換]

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

文字列sの中で最初に現れる文字cの位置を返す関数、StrChar( )を作ります。この関数は引数として、文字列sへのポインタと、char型の変数cを取ります。この関数のプロトタイプ宣言は、次のようになります。

    char *StrChar(char *s, char c);

ポインタsは最初は文字列の先頭を指しています。ループの中で、ポインタの指している中身と文字cを比較して、等しくなく、かつヌル文字('\0')でなければ、ポインタをインクリメントしループを繰り返します。

このループからは、値の等しい文字が見つかるか、ヌル文字に達するかすれば抜けます。抜けた時点で、ポインタの指す中身を調べて、もしヌルならヌルポインタを返し、そうでなければポインタを返します。

このアルゴリズムを、素直にコードにすると次のようになります。

    char *StrChar(char *s, const char c)
    {
        while (*s != c && *s != '\0')
            s++;
        if (*s == '\0')
            return (NULL);
        else
            return (s);
    }

次いで、文字列の末尾から前の方へ文字を検索していく関数、StrRChar( )を作ります。

文字列を指すポインタを、文字列の末尾のヌル文字('\0')まで進め、同じ文字が見つかるまでデクリメントしていけば良さそうです。しかし、これではうまくいきません。マッチする文字がなくて、ポインタが文字列の先頭を指しても、そこに歯止めがないので、ループから抜けず無意味な検索を続けてしまいます。そこで、もう1つポインタを用意して、ループに入る前にこのポインタに文字列の先頭アドレスを保存しておきます。ループの中で、このポインタと検索用のポインタを比較して、文字列の先頭を指したらループから抜けるようにします。

StrRChar( )を下記に示します。pが文字列の先頭アドレス保存用のポインタです。2つ目のループの条件判断のp < sで、先頭まで来たかどうかを判定しています。

    char *StrRChar(char *s, const char c)
    {
        char *p = s;

    while (*s != '\0')
        s++;

    while (*s != c && p < s)
        s--;
    if (*s == c)
        return (s);
    else
        return (NULL);
    }

*/

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

#include <stdio.h>

char *StrChar(char *s, const char c);
char *StrRChar(char *s, const char c);
void main(void);

  /* strの中で最初に現れるcの位置を返す(前から検索) */
char *StrChar(char *s, const char c)
{
  /* 検索文字が現れず、かつ、文字列の末尾に達するまでループする */
    while (*s != c && *s != '\0')
        s++;
    if (*s == '\0')           /* 見つからなかったら */
        return (NULL);        /* NULLを返す */
    else                      /* 文字が見つかったら */
        return (s);           /* その位置を指すポインタを返す */
}

  /* strの中で最初に現れるcの位置を返す(後から検索) */
char *StrRChar(char *s, const char c)
{
    char *p = s;                /* pに文字列の先頭アドレスを保存 */

    while (*s != '\0')          /* sが文字列の末尾を指すようにする */
        s++;
  /* 検索文字が現れず、かつ、文字列の先頭に達するまでループする */
    while (*s != c && p < s)
        s--;
    if (*s == c)            /* 文字が見つかったら */
        return (s);         /* その位置を指すポインタを返す */
    else                    /* 見つからなかったら */
        return (NULL);      /* NULLを返す */
}

void main(void)
{
    char *p;
    char c;
    char str[ ] = "abcdefghijklmnopqrstuvwxyz";

    printf("str = %s\n", str);        /* 検索対象文字列の表示 */
    printf(" 1 文字入力して下さい\t");
    scanf("%c", &c);                  /* 検索文字の入力 */


    p = StrChar(str, c);
    printf("\nStrChar(str, '%c');\n", c);
    if (p != NULL)                          /*見つかったら */
        printf("%s\n\n", p);                /* その位置より後ろを表示 */
    else                                    /* 見つからなかったら */
        printf("見つからない!\n");          /* この文を表示 */


    p = StrRChar(str, c);
    printf("StrRChar(str,'%c');\n", c);
    if (p != NULL)                          /*見つかったら */
        printf("%s\n", p);                  /* その位置より後ろを表示 */
    else                                    /* 見つからなかったら */
        printf("見つからない!\n");          /* この文を表示 */
}

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

[文字列を比較]←このソース→[大文字小文字変換]

青い直線

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

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>特定の文字の現れる位置