ページ 1 / 1
if break
Posted: 2009年5月17日(日) 10:29
by マウス
いつも楽しく拝見させてもらっています。
現在はC言語の基礎を学んでいる最中なのですが、以下のものがコンパイルできずに困っています。
breakの位置が悪いらしいのですが、どうしてでしょうか?
#include<stdio.h>
main()
{
int i;
char str1[21],str2[21];
printf("Input:");
scanf("%s",str1);
printf("Input:");
scanf("%s",str2);
for(i = 0;str1 != '\0';i++);
if(str1 != str2){
printf("not equal\n");
break;
}
printf("equal");
}
コンパイルエラー:エラー E2030 test.cpp 14: break の位置が誤っている(関数 main() )
入力を二回して両方が完全に正しいかどうかを判断する、というプログラムなのですが…。
回答宜しくお願い致します。
[環境など]
OS:WindowsXP
使用:CPad for Borland C++Compiler
知識:まだ文章を表示できるくらい
Re:if break
Posted: 2009年5月17日(日) 10:30
by MNS
for(i = 0;str1 != '\0';i++);
これのセミコロンを取ってみては?
for文はif文と同じく{}で囲む必要があります。
Re:if break
Posted: 2009年5月17日(日) 12:31
by box
コンパイルエラーが修正できたとします。
実行時に問題が起きそうです。
問題1)2つの文字列の内容が異なるとき、
not equal
equal
と出力します。
問題2)最初に入力したstr1の方が長いと、str2の、何が入っているかわからない箇所にアクセスします。
その結果、プログラムがどういう動きをするか、わからなくなります。
他にも何かあるかもしれません。
Re:if break
Posted: 2009年5月17日(日) 17:59
by situmon
ちょっと本格的にしてみましたが、間違えもあるかもしれませんのでそこはご了承ください。
無限ループです。
#kazuoniさんのいうとおりでしたので消します。少し考えることにします。
Re:if break
Posted: 2009年5月17日(日) 18:29
by kazuoni
>situmonさん
asdとzsxと入力してみてください。
結果が異なってます。
Re:if break
Posted: 2009年5月17日(日) 20:48
by マウス
皆さん、迅速かつ丁寧な対応・回答ありがとうございます。
今日はC言語環境のPCが使えないため、まだ確認できていないのですが皆様からいただいた回答を基に自分でもチャレンジしてみたいと思います。
見の周りにはC言語が分かる方がおらず途方にくれていましたので、本当に助かりました。
また何かあれば宜しくお願い致します。
Re:if break
Posted: 2009年5月17日(日) 21:57
by situmon
できました!
#include<stdio.h>
void main()
{
int i,j,k;
char str1[21],str2[21];
while(1){
printf("%%%%%%%%%%%%%%\n");
printf("%言葉が同じか判定します。%\n");
printf("%%%%%%%%%%%%%%\n");
printf("Input:");
scanf("%s",str1);
printf("最初に入力した言葉{%s}\n",str1);
printf("Input:");
scanf("%s",str2);
printf("次に入力した言葉{%s}\n",str2);
for(i=0;i<21;){//最初の言葉の文字数を調べる
if(str1!='\0')
i++;
else
break;
}
for(j=0;j<21;){//次の言葉の文字数を調べる
if(str2[j]!='\0')
j++;
else
break;
}
if(i==j){//文字数が同じなので二つの言葉の文字がすべて同じか調べる
for(k=0;k<i;){//調べた言葉の文字の個数が調べる文字の個数と同じになるまで繰り返す。
if(str1[k]==str2[k])//調べた文字が同じなら次の文字へ
k++;
if(str1[k]!=str2[k]){//文字数が同じだが二つの文字が違うものなので違う言葉
printf("二つの言葉は違う言葉です。\n");
printf("****************************\n");
break;
}
if(k==i){//調べる言葉の文字の個数が調べた文字の個数と同じなら同じ言葉
printf("二つの言葉は同じ言葉です。\n");
printf("****************************\n");
}
}
}
else{//文字数が違うので二つは違う言葉
printf("二つの言葉は違う言葉です。\n");
printf("****************************\n");
}
}
}
たぶんこれだと実行結果に間違えがなくなります。
また間違えていたらすいませんがご指摘ください。
またここはこれだけですむからこちらのかきかたがいい!などもおねがいします。
#すいません、調べると調べたのいちおかしかったのでなおしました。
Re:if break
Posted: 2009年5月17日(日) 22:18
by かなで
皆さんもお答えの通り
for(i = 0;str1 != '\0';i++);
if(str1 != str2){
printf("not equal\n");
break;
}
printf("equal");
の
for(i = 0;str1 != '\0';i++);
を
for(i = 0;str1 != '\0';i++){
処理
}
にしてみてください
Re:if break
Posted: 2009年5月17日(日) 22:23
by kazuoni
>situmonさん
改善するとすれば、
・文字列のそれぞれの長さを調べる必要がない
・scanfではスペースなどの空白を読み込めない
ですが、ここはトピ主さんにとっては必要のないことですので控えます^^;
Re:if break
Posted: 2009年5月18日(月) 06:36
by situmon
kazuoniさんのいうように、
>>・文字列のそれぞれの長さを調べる必要がない
確かに必要ないかもしれません、
一応動作はするとおもいますのでもしかえたいのならここをかえるといいかもしれません。
>>・scanfではスペースなどの空白を読み込めない
今回はscanfだったのでそこまでかえるとかなり違ってくるので・・・