【最大10000ポイント】当たる!!質問投稿キャンペーン!

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

よろしくお願いします。

A 回答 (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;
}
など、いろいろな「一致」を統一的に処理することができます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/11/28 15:42

わからないけど、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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/11/28 15:41

考え方だけですが


再帰処理のロジック作って比較先・規格元のデータポインタさえ
きっちり管理してやればそれでできると思います

ロジックなんで作る人の自由ですが
変な条件で判定するよりそちらのほうがいいような気がします

サンプリ条件での流れ
1.比較データとして abc までを取得
2.比較先データ内に1のデータがあるかをチェック なければNULL あれば
  比較終了位置のデータポインタを返す
3.2の戻り値がNULLなら不一致で終了  そうでないなら4へ
4.比較データのポインタを動かし次の有効データ ef を取得(1と同様)
5.比較先データ内に4のデータがあるかをチェック なければNULL あれば
  比較終了位置のデータポインタを返す(2と同様)
6.3と同様

といった形で実現できそうな気がします
(1から3を再帰処理させ比較データ終わるまで実行する)

※ 細かく確認はしてませんので多少手直しが必要かとは思いますが
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/11/28 15:40

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



∀i( a[i] == b[i] || a[i] == '?' || b[i] == '?' )
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2010/11/28 15:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング