写一个宏is_digit,如果参数是十进制数字,则返回true

时间:2015-11-25 01:59:25

标签: c++ macros

我正在尝试解决c ++实用编程问题。这就是问题所在。

写一个宏is_digit,如果参数是十进制数,则返回true。 写第二个宏is_hex,如果其参数是十六进制数字(0-9 A-F a-f),则返回true。第二个宏应该引用第一个。

这是我的代码。问题是当输入不是十进制数字时,宏is_digit没有返回0到digit_res。

任何人都可以在我出错的地方帮助我。

#include<iostream>
using namespace std;
#define is_digit(x) (((x)=='0')||((x)=='1')||((x)=='2')||((x)=='3')||((x)=='4')||((x)=='5')||((x)=='6')||((x)=='7')||((x)=='8')||((x)=='9'))
#define is_hex(x) ((is_digit(x))||((x)=='a')||((x)=='b')||((x)=='c')||((x)=='d')||((x)=='e')||((x)=='f')||\
((x)=='A')||((x)=='B')||((x)=='C')||((x)=='D')||((x)=='E')||((x)=='F'))

int problem10_3()
{
string x;
int digit_res,hex_res;
cout<<"Enter Decimal or Hexadecimal:";
cin>>x;
digit_res=is_digit(x);
if(digit_res==1)
    cout<<"You have entered Decimal digit"<<endl;
else
{
 hex_res=is_hex(x);
 if(hex_res==1)
     cout<<"You have entered Hexadecimal digit"<<endl;
 else
     cout<<"You have not entered either Decimal or Hexadecimal"<<endl;
}

return 0;
}

先谢谢

4 个答案:

答案 0 :(得分:2)

嗯,你确实倒退了。您“返回”0而不是1,反之亦然。没有冒犯,但很难看出除了愚蠢的错字之外的任何事情。

此外,您使用字符文字'x'“调用”宏,而不是任何变量。您可能打算首先将&x[0] stdin 读取到char

答案 1 :(得分:2)

有一个标准的库std::isdigit函数,以及十六进制的std::isxdigit,但是如果你真的觉得需要编写宏,你可以在没有三元或相等比较的情况下这样做

#define is_digit(x) ('0' <= (x) && (x) <= '9')

不需要使用三元

(a == b ? 1 : 0)

与写作相同

(a == b)

如果你的目标是在编译时计算值,那么你应该使用constexpr函数

constexpr bool is_digit(char x) {
    return '0' <= x && x <= '9';
}

答案 2 :(得分:1)

你有逻辑吗?向后

<condition> ? <if true> : <if false>

所以

#define is_digit(x) (((x)=='0')||((x)=='1')||((x)=='2')||((x)=='3')||((x)=='4')||((x)=='5')||((x)=='6')||((x)=='7')||((x)=='8')||((x)=='9'))?1:0

正如我之前所说 - 不要在c ++中使用宏 - 使用内联函数

答案 3 :(得分:0)

nnn在评论中说你也有这个

digit_res=is_digit('x');
你的意思是

digit_res=is_digit(x);