• ベストアンサー

配列

キーボードから文字列を二つ入力し、文字列が一致しているか否かを表示するプログラムで、 基本的な部分は出来たんですが文字列中の「?」はすべての文字と一致する文字とする、という条件がどうしてもわからずこまっています。 例:「abc?ef」 「abcDef」 「abc?ef」 「??ckef」(すべて一致する) よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; } など、いろいろな「一致」を統一的に処理することができます。

zzaqq
質問者

お礼

とても詳しい説明どうもありがとうございます。

その他の回答 (3)

回答No.3

わからないけど、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; }

zzaqq
質問者

お礼

コードまで書いていただきどうもありがとうございます。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

考え方だけですが 再帰処理のロジック作って比較先・規格元のデータポインタさえ きっちり管理してやればそれでできると思います ロジックなんで作る人の自由ですが 変な条件で判定するよりそちらのほうがいいような気がします サンプリ条件での流れ 1.比較データとして abc までを取得 2.比較先データ内に1のデータがあるかをチェック なければNULL あれば   比較終了位置のデータポインタを返す 3.2の戻り値がNULLなら不一致で終了  そうでないなら4へ 4.比較データのポインタを動かし次の有効データ ef を取得(1と同様) 5.比較先データ内に4のデータがあるかをチェック なければNULL あれば   比較終了位置のデータポインタを返す(2と同様) 6.3と同様 といった形で実現できそうな気がします (1から3を再帰処理させ比較データ終わるまで実行する) ※ 細かく確認はしてませんので多少手直しが必要かとは思いますが

zzaqq
質問者

お礼

詳しく書いていただきどうも有りがようございます。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

文字列aおよびbの位置iの文字をそれぞれa[i]、b[i]として、以下が成り立つことを証明すればよいかと。 ∀i( a[i] == b[i] || a[i] == '?' || b[i] == '?' )

zzaqq
質問者

お礼

ありがとうございます。

関連するQ&A