質問: int count_a(char a, int *a_counter){ int i=0; while(a[i]!='\0'){ i++; *a_counter++; } return *a_counter; } int count_b(char b, int *b_counter){ int i=0; while(b[i]!='\0'){ i++; *b_counter++; } return *b_counter; } void judge(char a, char b, int a_counter, int *j){ int i, flag=1; for(i=0; i
回答: 難しく考えすぎ、しかも変数/関数名も適当な印象を受けます。 どうすれば解決できるかイメージがはっきりしていないのではないでしょうか? > > 引数の変数に&をつけて、対象の関数の仮引数に*をつけると値を保存できるルール > > > ルールじゃないです。ちゃんと理由があります。 よくわからないで使っているならば、一歩立ち返ってポインタを復習しましょう。 また、他にも次の部分も気になります。 > > > ``` > a_counter = count_a(a, &a_counter); > ``` > > `a_counter`のアドレスを引数として与えている意味が全くわからないです。 **『どうしてこう書くのか?』**を説明できるようになりましょう。 まずはじっくり考え、どのような関数を用意すればいいか考えましょう。 アルゴリズムを思いつけば、後はコードに書くだけです。例えばこんな感じです。 ``` #include #include #include #include // // str1とstr2を、頭からn文字分比較する // @return 全部一致でtrue, そうでなければfalse bool strcmp_n(const char* str1, const char* str2, size_t n) { ... } // // targetからkeywordを見つけ出す // @return 見つかったら何文字目かを返し、見つからなければ-1を返す int find_string(const char* target, const char* keyword) { ... } int main(void) { const char str1[] = "World University"; // とりあえず四回試す for(int i = 0; i < 4; ++i) { char str2[20]; printf("input str2: "); if(scanf("%19s", str2) != 1) exit(1); int search_result = find_string(str1, str2); if(search_result == -1) { printf("%s is not included in %s\n", str2, str1); } else { printf("%s is included at %d in %s\n", str2, search_result, str1); } } return 0; } ``` 敢えて部分的にコードを伏せていますが、簡単な動作確認はしています。 行数はそれぞれ高々両手で数えられるくらいです。 Cの文字列(というか配列)は少し癖があるので、慣れも必要ですが。