if break

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

if break

#1

投稿記事 by マウス » 16年前

いつも楽しく拝見させてもらっています。
現在は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
知識:まだ文章を表示できるくらい

MNS

Re:if break

#2

投稿記事 by MNS » 16年前

for(i = 0;str1 != '\0';i++);
これのセミコロンを取ってみては?
for文はif文と同じく{}で囲む必要があります。

box

Re:if break

#3

投稿記事 by box » 16年前

コンパイルエラーが修正できたとします。
実行時に問題が起きそうです。

問題1)2つの文字列の内容が異なるとき、
not equal
equal
と出力します。

問題2)最初に入力したstr1の方が長いと、str2の、何が入っているかわからない箇所にアクセスします。
その結果、プログラムがどういう動きをするか、わからなくなります。

他にも何かあるかもしれません。

situmon

Re:if break

#4

投稿記事 by situmon » 16年前

ちょっと本格的にしてみましたが、間違えもあるかもしれませんのでそこはご了承ください。

無限ループです。
#kazuoniさんのいうとおりでしたので消します。少し考えることにします。

kazuoni

Re:if break

#5

投稿記事 by kazuoni » 16年前

>situmonさん

asdとzsxと入力してみてください。
結果が異なってます。

マウス

Re:if break

#6

投稿記事 by マウス » 16年前

皆さん、迅速かつ丁寧な対応・回答ありがとうございます。
今日はC言語環境のPCが使えないため、まだ確認できていないのですが皆様からいただいた回答を基に自分でもチャレンジしてみたいと思います。

見の周りにはC言語が分かる方がおらず途方にくれていましたので、本当に助かりました。
また何かあれば宜しくお願い致します。

situmon

Re:if break

#7

投稿記事 by situmon » 16年前

できました!
#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

#8

投稿記事 by かなで » 16年前

皆さんもお答えの通り
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++){
処理
}

にしてみてください

kazuoni

Re:if break

#9

投稿記事 by kazuoni » 16年前

>situmonさん
改善するとすれば、

・文字列のそれぞれの長さを調べる必要がない
・scanfではスペースなどの空白を読み込めない

ですが、ここはトピ主さんにとっては必要のないことですので控えます^^;

situmon

Re:if break

#10

投稿記事 by situmon » 16年前

kazuoniさんのいうように、
>>・文字列のそれぞれの長さを調べる必要がない
確かに必要ないかもしれません、
一応動作はするとおもいますのでもしかえたいのならここをかえるといいかもしれません。
>>・scanfではスペースなどの空白を読み込めない
今回はscanfだったのでそこまでかえるとかなり違ってくるので・・・

閉鎖

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