- ベストアンサー
配列
キーボードから文字列を二つ入力し、文字列が一致しているか否かを表示するプログラムで、 基本的な部分は出来たんですが文字列中の「?」はすべての文字と一致する文字とする、という条件がどうしてもわからずこまっています。 例:「abc?ef」 「abcDef」 「abc?ef」 「??ckef」(すべて一致する) よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
一般的なお話ですが、こういう問題を ・二つの文字列が一致するのに加えて、?の時の処理を考える という方針でやるのは難しくなる傾向があります。 ・二つの文字列が一致するかどうかを判断する (一致するというのは、本当に等しいか、どちらか一方が?の時) という方針だと、ちょっと楽です。 基本的な部分はできたということなので、その文字列を比較する部分に if (a[i] == b[i]) ... という感じ部分があると思います。 これは、「一文字が一致するかどうか比較する」ということなので、 「一致する」=(本当に等しいか、どちらか一方が?) に書き換えると、 if (a[i] == b[i] || a[i] == '?' || b[i] == '?') ... と言うことになります。 もう少し一般的には、これを、 if(isEqual(a[i], b[i])) .... と、「等しいかどうか?」という関数を呼ぶ形にすれば、 int isEqual(char a, char b) { return (a == b); } や、 int isEqual(char a, char b) { if (a == b) return 1; if (a == '?') return 1; if (b == '?') return 1; return 0; } など、いろいろな「一致」を統一的に処理することができます。
その他の回答 (3)
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
わからないけど、strcmp()に「 || *a=='?' || *b=='?'」を加えたこんな感じじゃないかなぁ。 //等しければゼロを返す int hotcmp(char *a, char *b) { int judge; while(*a && *b && *a==*b || *a=='?' || *b=='?') a++,b++; if(*a>*b) judge=1; else if(*a<*b) judge=-1; else judge=0; return judge; }
お礼
コードまで書いていただきどうもありがとうございます。
- koi1234
- ベストアンサー率53% (1866/3459)
考え方だけですが 再帰処理のロジック作って比較先・規格元のデータポインタさえ きっちり管理してやればそれでできると思います ロジックなんで作る人の自由ですが 変な条件で判定するよりそちらのほうがいいような気がします サンプリ条件での流れ 1.比較データとして abc までを取得 2.比較先データ内に1のデータがあるかをチェック なければNULL あれば 比較終了位置のデータポインタを返す 3.2の戻り値がNULLなら不一致で終了 そうでないなら4へ 4.比較データのポインタを動かし次の有効データ ef を取得(1と同様) 5.比較先データ内に4のデータがあるかをチェック なければNULL あれば 比較終了位置のデータポインタを返す(2と同様) 6.3と同様 といった形で実現できそうな気がします (1から3を再帰処理させ比較データ終わるまで実行する) ※ 細かく確認はしてませんので多少手直しが必要かとは思いますが
お礼
詳しく書いていただきどうも有りがようございます。
- osamuy
- ベストアンサー率42% (1231/2878)
文字列aおよびbの位置iの文字をそれぞれa[i]、b[i]として、以下が成り立つことを証明すればよいかと。 ∀i( a[i] == b[i] || a[i] == '?' || b[i] == '?' )
お礼
ありがとうございます。
お礼
とても詳しい説明どうもありがとうございます。