• ベストアンサー

どんな処理をしているかおしえてください。

strcmp()で、大文字と小文字を区別しないタイプのもの作れをいう問題があって、 回答のソースは、 int streql(char *s1,char *s2){ char q1[256],q2[256],*q1,*q2; strcpy(q1,s1); strcpy(q2,s2); while(*s1){ if( tolower(*p1) != tolower(*p2) ); return(*s1-*s2); s1++; s2++; p1++; p2++; } return(0); } main(void) { printf("%d\n",streql("ABCDEF","abcdef")); } でした、while文のところの解説してもらえませんか。 お願いします。 あと、自分のパソコン(WindowsME,VC++6.0)だと,不正な処理をしたので強制終了しますっていうメッセージがでて実行できません。その理由も教えてもらいたいです。

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> c1とc2を先頭から1文字ずつくらべていって、同じだったら、0が返って、ちがかったら0以外が返るってことなんでしょうか? そう、そう。問題で指定されている strcmp() という関数がそういう仕様なんですね。 で、使う側(メインの側)では、こんな感じで。 char *s1 = "ABCDEFG"; char *s2 = "abcdefg"; if (streql(s1, s2) == 0) { /* 戻りが 0 だったら「同じ」という意味 */ printf("同じだよ (%s と %s は)\n", s1, s2); }

sin11
質問者

お礼

さっそく回答していただいてありがとうございます。これでなんとかりかいできました。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

元の形を尊重して、スリムにすると、こんな感じかな。 int streql(const char *s1, const char *s2) { char c1, c2; /* 文字列全体をコピーする必要は無いです */ while (*s1 != '\0') { /* while (*s1) は、これと同じ */ c1 = tolower(*s1); c2 = tolower(*s2); if (c1 != c2) /* 行末の ; は要らない */ return c1 - c2; /* return に括弧は必要ないです */ ++s1; ++s2; } return 0; } # 試してません (^^;

sin11
質問者

お礼

回答ありがとうございます。 プログラム、分かりやすいです。 で、申し訳ないんですが、returnのところはどういうことなんでしょうか? c1とc2を先頭から1文字ずつくらべていって、同じだったら、0が返って、ちがかったら0以外が返るってことなんでしょうか? そもそも、関数から0がかえったら、メイン関数の方ではどういうふうな意味になるのでしょうか? ひまがあったら、もう1度教えてもらえるとうれしいです。 お願いします

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 転記ミスだと思いますが、プログラムにいくつか問題があるし 非常に分かりづらいコーディングになっています。 先ずは問題点: 1) 同一名の変数が定義されている。  char q1[256],q2[256],*q1,*q2; // ← この行  char q1[256],q2[256],*p1,*p2; // これが正解だと思います。 2) 初期化されていないローカル変数が使用されている。  strcpy() の前か、while に入る前に、  p1 = q1; p2 = q2; // これが抜けているためにエラーになっていると  // 思います。 3) s1に渡した文字列の方が長さが短かった場合、処理が途中で終了してしまう。  これは、while(*s1) とs1 だけで判断を行っているためです。 プログラムをもう少し分かりやすくすると、以下のようになります。 int streql(char *s1,char *s2) {   int loop, rinf;   for (loop = 0, rinf = 0;; loop++) {     rinf = (tolower(*(s1 + loop)) - tolower(*(s2 + loop)));     if ((rinf != 0) || ('\0' == *(s1 + looop) || ('\0' == *(s2 + loop)))) {       break;     }   }   return(rinf); }

sin11
質問者

お礼

回答ありがとうございます。 教えていただいたプログラムを試してみます。

sin11
質問者

補足

ソース間違ってましたね。すません。 実際は int streql(char *s1,char *s2){ char q1[256],q2[256],*p1=q1,*p2=q2; strcpy(q1,s1); strcpy(q2,s2); while(*s1){ if( tolower(*p1) != tolower(*p2) ); return(*s1-*s2); s1++; s2++; p1++; p2++; } return(0); } main(void) { printf("%d\n",streql("ABCDEF","abcdef")); }

関連するQ&A