ページ 11

文字の変換について

Posted: 2013年7月13日(土) 21:02
by saaya
半角アルファベットの大文字を小文字に、小文字を大文字に変換したいのですが、動かしてみると違う文字が出てきます。
もしよろしければここを変えた方がいいなどアドバイスお願いします。

コード:

#include <stdio.h>
#include <string.h>
int main()
{
	char x[100], y, z;
	int count;
	printf("string=");
	scanf("%s", x);

	count = 0;
	y = 0;
	while (count < 100){	
		if (x[count]=='\0'){
			break;
		}
		else {
			count++;
			y = x[count];
			if ((y >= 'A') && (y <= 'Z')){
				z = y + 0x20;
				printf("%c", z);
			}
			else ((y >= 'a') && (y <= 'z'));{
				z = y - 0x20;
				printf("%c", z);
			}			
		}
	}
	return 0;
}

Re: 文字の変換について

Posted: 2013年7月13日(土) 21:15
by みけCAT
else文のところが間違っています。
isupper、islower、toupper、tolower関数を使ってはいけないのですか?

Re: 文字の変換について

Posted: 2013年7月14日(日) 15:47
by へにっくす
もっと具体的に言った方が親切かと ^^;

コード:

else ((y >= 'a') && (y <= 'z'));{
なんですかこれ?elseの後に条件文はつけられません。
ifを忘れちゃダメですよ。

Re: 文字の変換について

Posted: 2013年7月14日(日) 15:55
by naohiro19
gccやVisual Studio、Boland C++ コンパイラではこのプログラムはコンパイルできません。

Re: 文字の変換について

Posted: 2013年7月14日(日) 16:11
by みけCAT
へにっくす さんが書きました:もっと具体的に言った方が親切かと ^^;

コード:

else ((y >= 'a') && (y <= 'z'));{
なんですかこれ?elseの後に条件文はつけられません。
ifを忘れちゃダメですよ。
条件文の後に余計なセミコロンがついているのも問題です。
naohiro19 さんが書きました:gccやVisual Studio、Boland C++ コンパイラではこのプログラムはコンパイルできません。
Ideoneで試すと、コンパイルエラー扱いにはならないけど何も出力されない、という謎現象が発生しました。
なぜでしょうか…?
http://ideone.com/cX4N8E

さらに、ローカルで試すと以下のようになりました。
mozi_no_henkan_test.png
ローカルでコンパイルするテスト
mozi_no_henkan_test.png (57.97 KiB) 閲覧数: 3858 回
「コンパイルできません」は間違いのようですが、やはり実行結果がおかしいです。

Re: 文字の変換について

Posted: 2013年7月14日(日) 16:18
by a5ua

コード:

#include <stdio.h>
#include <string.h>
int main()
{
	char x[100], y, z;
	int count;
	printf("string=");
	scanf("%s", x);

	count = 0;
	y = 0;
	while (count < 100){    
		if (x[count]=='\0'){
			break;
		}
		else {
			count++;
			y = x[count];
			if ((y >= 'A') && (y <= 'Z')){
				z = y + 0x20;
				printf("%c", z);
			}
			else
				((y >= 'a') && (y <= 'z'));	/* 意味のない文 */
			
			/* 条件にかかわらず実行される */
			{ 
				z = y - 0x20;
				printf("%c", z);
			}           
		}
	}
	return 0;
}
コンパイルは出来ると思いますが、意図した動作にはならないでしょう。
上記に様にコードを整形すればわかると思います。

問題点はいくつかありますが、2点ほど指摘します。

コード:

count++;
y = x[count];
count番目の文字を見たいのなら、インクリメントのタイミングが不適切です。

コード:

else ((y >= 'a') && (y <= 'z'));{
else if (条件)とすると良いと思います。