文字列の比較について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taku

文字列の比較について

#1

投稿記事 by taku » 18年前

今文字列の比較にかんするプログラムを作っているのですがもう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分からできるだけ難しい関数?を使わないで教えてもらいたいです。
長文、駄文ですみませんがよろしくお願いします。

miyaza

Re:文字列の比較について

#2

投稿記事 by miyaza » 18年前

なぜ、mojiBが"H"のときMatch!が出るのか、その理由だけ書きます。
mijiAに"HELP"が入っていてmojiBに"H"入っているとき、まずこのプログラムは先頭の文字Hを比較しますこのとき条件を満たしているので、flagが1になります。そして次にwhile()の判定が来たときmojiBの中身は'\0'となっています。
したがってループを抜けます。
そしてif(flag)の部分でflagが1のためMatch!が表示されます。

taku

Re:文字列の比較について

#3

投稿記事 by taku » 18年前

言っていることは知っていました。
だいたい解決しましたのでありがとうございました。

なぎ

Re:文字列の比較について

#4

投稿記事 by なぎ » 18年前

ちょっとしたテクニックとしては、「終わってからもう一回比較する」というのがあります。
while(mojiA!='\0' && mojiB!='\0')
{
if(mojiA != mojiB) break;
i++;
}

// ここでループが終わったのはなぜか?(2つのケースが考えられる)
if (mojiA == mojiB) 文字列は等しい
else 文字列は等しくない

これだと、フラグも不要です。

なぎ

Re:文字列の比較について

#5

投稿記事 by なぎ » 18年前

もうひとつ、flag の使い方で。
flag は、
・初期設定でどちらかにセット
・処理の中では、その反対側にセットのみ(初期値と同じセットはしない)
というのが鉄則です。
しかも、
・and 条件でセット

今回の場合、「1文字でも違えばアウト」
なので、「違う」ほうが and 条件になります。
ですから、フラグの処理としては、

・「マッチ」を表す状態に初期化
・「アンマッチ」が検出されたところで、「アンマッチ」の状態に変更
・「マッチ」が検出されても、フラグはいじらない
という操作になります。

最初のソースだと、多分、"HELP" と "AAAP" でもマッチしてしまうと思います。
(未チェック)

taku

Re:文字列の比較について

#6

投稿記事 by taku » 18年前

なぎさん返答ありがとうございました。
自分もなぎさんと同じようにできました~。
flagの使い方の説明は参考になりました^^
ありがとうございます、

閉鎖

“C言語何でも質問掲示板” へ戻る