文字列から文字群が見つかった位置を返す

K&R本 演習2-5

文字列s2の任意の文字と等しい文字列s1の最初の文字位置を返す関数any(s1,s2)を書け。ただし一致する文字がなければ-1を返す。

今度は誤読しないよう。

#include <stdio.h>

int any(const char *s1,const char *s2) {
    const char *s = s2;
    int i,j;
    int len = 0;
    int ret = -1;
    while(*s++){ len++; }
    
    for(i=0;s1[i];++i) {
        for(j=0;j<len;++j) {
            if ( s1[i] == s2[j] ) {
                ret = i;
                goto LOOP;
            }
        }
    }
    LOOP:
    
    return ret;
}

int main (void) {
    char str[] = "abcdefgabcdefghij";
    
    printf("%d番目\n",any(str,"ghsp"));
    if ( any(str,"sp") == -1 ) {
        puts("見つかりませんでした");
    }
    return 0;
}

できました。gotoを使っていますが、多重ループから抜けるだけの目的であれば使用しても良いというMYコーディングルールにより使用します。

本当はretを用意せずに

    for(i=0;s1[i];++i) {
        for(j=0;j<len;++j) {
            if ( s1[i] == s2[j] ) {
                goto LOOP;
            }
        }
    }
    i = -1;
    LOOP:
    
    return i;

とこのようにiを使いまわせば実装できないことはないんですが、この場合多重ループから抜けるためだけのgotoというコーディングルールを破ることになるのでやめました。