半角英字aからzを判定するマクロを作成。
aからzの場合は真の値を返し、違う場合は偽の値を返す。
という問題が有り、
#define hantei(charactor) ((charactor => 'a') || (charactor =< 'z') )? 1 : 0
という解答をしたところ、惜しいと返ってきました。
些細なミスと言われたのですが、そのミスがわかりません。
どこがおかしいのでしょうか?
半角英字の判定をするマクロを作成する問題
Re: 半角英字の判定をするマクロを作成する問題
言語が指定されていませんが、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で殴ればいい!(死亡フラグ)
Re: 半角英字の判定をするマクロを作成する問題
(1)真になる条件を日本語で表現する
(2)その通りのコードになっているか確認する
(1)がわかるなら,(2)は単なる文法の問題なので,再確認すればいかがでしょうか.
(2)その通りのコードになっているか確認する
(1)がわかるなら,(2)は単なる文法の問題なので,再確認すればいかがでしょうか.
Re: 半角英字の判定をするマクロを作成する問題
しまった…一般的な落とし穴にばかり気を取られて見逃してしまった…usao さんが書きました:ん? ||はそのまま…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 半角英字の判定をするマクロを作成する問題
文字コードの値がまちゃ さんが書きました:||はどう違うのでしょうか?
'a' 以上
「または」
'z' 以下
である場合、おそらくはすべての文字を半角英字であると判定してしまうような気がします。
整数の場合に置き換えてみましょう。例えば
5 以上
「または」
10 以下
であるような整数って、「すべての」整数ですよね。
5~10の範囲の整数だけを取り出したければ、「または」ではなくて、何でしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。