- ベストアンサー
ポインタを使って
みなさんこんにちは。 初歩的な質問ですみません。m(_ _)m キーボードから二つの文字列を読み込んだ場合、 読み込んだ文字列の中に同じ文字があるか、あれば その個数を数えるプログラム と言う問題があるのですが。 上記のプログラムは、for文を使って、一つ一つの文字をstrcmpを使って表示するべきものなのでしょうか。 もし、文の意味が違っていたり、もっと簡単なやりかたがありましたら、教えてください。 初歩的で申し訳ございません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こういうのかな? #include <stdio.h> int main(void) { char *s0 = "abcdefg", *s1 = "efghijk"; int c[256] = {0}; int count = 0, i; for(i = 0; s0[i] != '\0'; i ++) c[s0[i]] |= 1; for(i = 0; s1[i] != '\0'; i ++) c[s1[i]] |= 2; for(i = 0; i < 256; i ++) count += (c[i] == 3); printf("%d", count); return 0; }
その他の回答 (2)
- Trick--o--
- ベストアンサー率20% (413/2034)
strcmpは「文字列」を比較する関数。 「文字」を比較するのには使えない。普通に==で行う。 なので、 「for文を使って、一つ一つの文字を==或いは!=を使って」比較すればよい。 ループの回数はstrlenを使えばわかりそうだね。
お礼
解答ありがとうございます。 たしかに、strcmpばかり、考えていたもんで。 気づきませんでした。
- ddnp009
- ベストアンサー率25% (15/58)
"yamada", "tanaka" の場合、どのような出力が欲しいか補足して下さい。 また、一つ一つの文字を各個照査するならば strcmpを用いるまでもない(用いるべきではない)。 数値の比較で足りる。例えばこんなの↓ int main(int argc, char** argv) { char *plhs, *prhs; int founded; if ( argc != 3 ) { puts ("must two strings."); return 1 /* EXIT_FAILURE */; } for ( prhs = *(argv + 2); *prhs; ++prhs ){ founded = 0; for ( plhs = *(argv + 1); *plhs; ++plhs ) if ( *prhs == *plhs ) ++founded; /* compare */ if ( founded > 0 ) printf("'%c' founded %d count.\n", *prhs, founded); } return 0; } #工夫もへったくれもないソースなので #丸々コピペして提出というのはダメね。
お礼
早い解答ありがとうございます。 yamada tanaka の場合 出力としては、「aが六個あります。」と言った出力で、 kazu nihon の場合だと 同じ、文字は、ありません。と言う出力 です。 ソースを参考にして作ってみたいと思います。
お礼
解答ありがとうございます。 早速試してみたら少しエラーが出たのでで、このソースを元に、書き直したら、できました。