半角英字の判定をするマクロを作成する問題

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

半角英字の判定をするマクロを作成する問題

#1

投稿記事 by まちゃ » 11年前

半角英字aからzを判定するマクロを作成。
aからzの場合は真の値を返し、違う場合は偽の値を返す。

という問題が有り、
#define hantei(charactor) ((charactor => 'a') || (charactor =< 'z') )? 1 : 0
という解答をしたところ、惜しいと返ってきました。
些細なミスと言われたのですが、そのミスがわかりません。
どこがおかしいのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 半角英字の判定をするマクロを作成する問題

#2

投稿記事 by みけCAT » 11年前

言語が指定されていませんが、C言語と仮定します。
  • C言語に=>、=<という演算子はありません。それぞれ>=、<=と書くべきです。
  • ASCIIのようなaからzまでの英字が連続している文字コードでしかうまく動きません。例えばEBCDICでは英字の文字コードが連続していません。
  • マクロの式中にcharactorが2回出てきているので、例えばhantei(a++)などの使い方をすると意図しない挙動になることがあります(GCC拡張を用いないと修正は難しいので、あまり気にしなくてよい)。
  • マクロ全体がカッコで囲まれていないので、式の計算結果が意図しない物になることがあります(撃墜例1)。
  • characterがカッコで囲まれていないので、式の計算結果が意図しない物になることがあります(撃墜例2)。

コード:

#include <stdio.h>

/* #define hantei(charactor) ((charactor => 'a') || (charactor =< 'z') )? 1 : 0 */
#define hantei(charactor) ((charactor >= 'a') || (charactor <= 'z') )? 1 : 0

int main(void) {
	/* 撃墜例1 */
	if (hantei('a') && hantei('0')) {
		puts("NG");
	} else {
		puts("OK");
	}

	/* 撃墜例2 */
	if (hantei(300 | 0)) {
		puts("NG");
	} else {
		puts("OK");
	}

	return 0;
}
最後に編集したユーザー みけCAT on 2015年3月09日(月) 15:44 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1892
登録日時: 12年前
連絡を取る:

Re: 半角英字の判定をするマクロを作成する問題

#3

投稿記事 by usao » 11年前

(1)真になる条件を日本語で表現する
(2)その通りのコードになっているか確認する


(1)がわかるなら,(2)は単なる文法の問題なので,再確認すればいかがでしょうか.

まちゃ

Re: 半角英字の判定をするマクロを作成する問題

#4

投稿記事 by まちゃ » 11年前

ありがとうございます。
>=と<=についてはケアレスミスでした。

わかりやすい解説有難うございました。


アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 半角英字の判定をするマクロを作成する問題

#6

投稿記事 by みけCAT » 11年前

usao さんが書きました:ん? ||はそのまま…?
しまった…一般的な落とし穴にばかり気を取られて見逃してしまった…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

まちゃ

Re: 半角英字の判定をするマクロを作成する問題

#7

投稿記事 by まちゃ » 11年前

||はどう違うのでしょうか?

box
記事: 2002
登録日時: 15年前

Re: 半角英字の判定をするマクロを作成する問題

#8

投稿記事 by box » 11年前

まちゃ さんが書きました:||はどう違うのでしょうか?
文字コードの値が
'a' 以上
「または」
'z' 以下
である場合、おそらくはすべての文字を半角英字であると判定してしまうような気がします。

整数の場合に置き換えてみましょう。例えば
5 以上
「または」
10 以下
であるような整数って、「すべての」整数ですよね。
5~10の範囲の整数だけを取り出したければ、「または」ではなくて、何でしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

まちゃ

Re: 半角英字の判定をするマクロを作成する問題

#9

投稿記事 by まちゃ » 11年前

あーなるほどです。
ここは「または」ではダメですね。
初歩的なミスでした。

閉鎖

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