我正在尝试解决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;
}
先谢谢
答案 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)
digit_res=is_digit('x');
你的意思是
digit_res=is_digit(x);