文字列から文字群が見つかった位置を返す
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というコーディングルールを破ることになるのでやめました。