今文字列の比較にかんするプログラムを作っているのですがもう1歩?の所で指摘をうけてしまいます。
ちなみにC言語の知識はさほどありません、初めて半年くらいです。
#include<stdio.h>
int main(void){
char mojiA[/url]="HELP";
char mojiB[/url]="HELP";
int flag;
int i;
flag=0;//flagの値が0のとき不一致
i=0;
while(mojiA!='\0'&&mojiB!='\0'){
if(mojiA==mojiB){
flag=1;
}
else
flag=0;
i++;
}
if(flag){
printf("Match!\n");
}
return(0);
}
このようなプログラムなんですが気をつけたことはmojiAとBの文字の長さがかわった時に文字の短いところで
ループが終了するようにしていると思うんですが例えばmojiBの値を'H'だけにした場合でもMatch!になって
しまいます。ループの条件がやはりわるいのでしょうか?
調べてみたのですがstrcmpのようなのはまだ教わっていないのでi=0;と初期化した
後のwhile分からできるだけ難しい関数?を使わないで教えてもらいたいです。
長文、駄文ですみませんがよろしくお願いします。
文字列の比較について
Re:文字列の比較について
なぜ、mojiBが"H"のときMatch!が出るのか、その理由だけ書きます。
mijiAに"HELP"が入っていてmojiBに"H"入っているとき、まずこのプログラムは先頭の文字Hを比較しますこのとき条件を満たしているので、flagが1になります。そして次にwhile()の判定が来たときmojiBの中身は'\0'となっています。
したがってループを抜けます。
そしてif(flag)の部分でflagが1のためMatch!が表示されます。
mijiAに"HELP"が入っていてmojiBに"H"入っているとき、まずこのプログラムは先頭の文字Hを比較しますこのとき条件を満たしているので、flagが1になります。そして次にwhile()の判定が来たときmojiBの中身は'\0'となっています。
したがってループを抜けます。
そしてif(flag)の部分でflagが1のためMatch!が表示されます。
Re:文字列の比較について
ちょっとしたテクニックとしては、「終わってからもう一回比較する」というのがあります。
while(mojiA!='\0' && mojiB!='\0')
{
if(mojiA != mojiB) break;
i++;
}
// ここでループが終わったのはなぜか?(2つのケースが考えられる)
if (mojiA == mojiB) 文字列は等しい
else 文字列は等しくない
これだと、フラグも不要です。
while(mojiA!='\0' && mojiB!='\0')
{
if(mojiA != mojiB) break;
i++;
}
// ここでループが終わったのはなぜか?(2つのケースが考えられる)
if (mojiA == mojiB) 文字列は等しい
else 文字列は等しくない
これだと、フラグも不要です。
Re:文字列の比較について
もうひとつ、flag の使い方で。
flag は、
・初期設定でどちらかにセット
・処理の中では、その反対側にセットのみ(初期値と同じセットはしない)
というのが鉄則です。
しかも、
・and 条件でセット
今回の場合、「1文字でも違えばアウト」
なので、「違う」ほうが and 条件になります。
ですから、フラグの処理としては、
・「マッチ」を表す状態に初期化
・「アンマッチ」が検出されたところで、「アンマッチ」の状態に変更
・「マッチ」が検出されても、フラグはいじらない
という操作になります。
最初のソースだと、多分、"HELP" と "AAAP" でもマッチしてしまうと思います。
(未チェック)
flag は、
・初期設定でどちらかにセット
・処理の中では、その反対側にセットのみ(初期値と同じセットはしない)
というのが鉄則です。
しかも、
・and 条件でセット
今回の場合、「1文字でも違えばアウト」
なので、「違う」ほうが and 条件になります。
ですから、フラグの処理としては、
・「マッチ」を表す状態に初期化
・「アンマッチ」が検出されたところで、「アンマッチ」の状態に変更
・「マッチ」が検出されても、フラグはいじらない
という操作になります。
最初のソースだと、多分、"HELP" と "AAAP" でもマッチしてしまうと思います。
(未チェック)
Re:文字列の比較について
なぎさん返答ありがとうございました。
自分もなぎさんと同じようにできました~。
flagの使い方の説明は参考になりました^^
ありがとうございます、
自分もなぎさんと同じようにできました~。
flagの使い方の説明は参考になりました^^
ありがとうございます、