K&R演習[2-5]

課題

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

回答

/**
 * @file    プログラミング言語C 2-5
 * @brief
 * @author  hiroyuki murai
 * @date    20171118
 * note
 */

#include <stdio.h>

int any(char *s1, char *s2);

/**
 * @fn  Main
 * @brief
 * @param
 * @return
 * @detail
 */
int main(void)
{
    int i;
    char s1[100], s2[100];

    // 動作確認[1]
    sprintf(s1, "klujkdfsaljweoiudjsaklcaxw");
    sprintf(s2, "zw");
    i = any(s1, s2);
    printf("%3d:%s, %s\n", i, s1, s2);

    // 動作確認[2]
    sprintf(s1, "klujkdfsaljweoiudjsaklcaxw");
    sprintf(s2, "pr");
    i = any(s1, s2);
    printf("%3d:%s, %s\n", i, s1, s2);

}

/**
 * @fn      any
 * @param   (char) *s2
 * @param   (char) *s1 
 * @return  (int) s1の発見位置。一致しなければ(-1)
 * @detail
 */
int any(char *s1, char *s2)
{
    int i, j, k;

    for (i = 0; s1[i] != '\0'; i++) {           // 検索対象
        for (j = 0; s2[j] != '\0'; j++) {       // 検索文字
            if (s1[i] == s2[j]) {               // 一致したら
                return i + 1;                   // 検索対象の位置を返す
            }
        }
    }
    return -1;  // 一致なし
}

実行結果

 12:klujkdfsaljweoiudjsaklcaxw, zw
 -1:klujkdfsaljweoiudjsaklcaxw, pr

所感

問題の日本語が分かりづらい。毎度の事ながら。