中易网

c语言 char类型 >和<运算和||运算时出现的问题

答案:2  悬赏:0  
解决时间 2021-02-19 10:09
我非常菜,简单的说,要判断一个字符串中的元素是不是16进制中的合法字符,a到f大小写都合法,已知0对应的ASC码是48,A是65,a是97,所以大概这么写:
char str[5];
scanf(...................)
for(i=0;i<4;i++)
{
if(str[i]<48||57102)
{
printf("Original data error\n");
return 0;
}
}
结果出问题了,比方说输入一个6666,结果程序在第一轮循环的时候就return 0了,而且输出了Original data error\n。也就是说if里的那个式子有问题。
于是我改成这样做实验:
if(str[i]<48)
........
当然这样写功能不完整,但是再输入6666,没问题了。
我就再改:
if(str[i]<48||57又出现了同样的问题,6通过了判断,又输出了Original data error\n,似乎这样的运算不能用||?

请看一下这个自定义函数:
它的目的是把16进制数的字符转化为十进制的,a到f大小写都合法,如果字符不和法,返回值是1.
int read(char c)
{
if((c>=48)&&(c<=57))
return c-48;
else
{
if((c>=97)&&(c<=102))
return c-87;
else
{
if(c>=65&&c<=70)
return c-55;
else
return 1;
}
}
}
可以看到这个自定义函数里有与上面类似的判断,但都用的是&&,这个函数没有问题,为什么?
感谢您看了这么多东西,我刚学c语言不久,所以这个问题可能很菜,但我也上网找过答案的,没有办法才提的这个问题,请不吝赐教。谢谢!
最佳答案
应该这样子写,你没搞清楚逻辑关系,应该是先满足条件,然后取反就可以。
if(!((str[i]>=48 &&57>=str[i])||(str[i]>=65&&70>=str[i])||(str[i]>=97&&str[i]<=102)))
{
    printf("Original data error\n");    
    return 0;
}
当然你列出所有情况也可以。但是列出所有情况的话你的判断就有问题。
应该这么写
if(str[i]<48||(57102)
{
    printf("Original data error\n");
    return 0;
}
全部回答
short是2字节的, 范围-32768-32767, unsigned short是0-65535 short sval=65536; 这个赋值后sval是0, 如果放65535就是-1, 65535放到unsigned short里才是65535
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
新星宇和邑到临河街与荣光路打车多少钱
人民币上少数民族的图案代表了什么
不是不和你说话,只是怕我在次爱上你.让我痛苦
中国邮政储蓄银行汇泉路营业所地址在哪,我要
裕达商行我想知道这个在什么地方
黑芝麻一天生吃多少对白发有好处
谁再玩lol我拆了他的R键
黑人女人唱的,有点爵士,歌词是this is me t
请问,囗里有腥味,偶尔有囗臭,是怎么回事啊
体检身高是用红外线测,有什么技巧测出来能高
给已提交的起诉书作补充怎么写
相约花行在什么地方啊,我要过去处理事情
computer games 和 vedio games 有什么区别?
班级上要搞故事演讲,请给我找几个有联系的成
三合北巷/兴旺大街(路口)地址有知道的么?有
推荐资讯
诺如台萨拉在什么地方啊,我要过去处理事情
taskalfa2010怎么样
买卖时房产证尚未办理,可以先公证并入住吗?
在网上买东西,我绝收了,卖家没有收到货怎么办
嘉途汽车轮胎经营部在什么地方啊,我要过去处
苏州火车站有家华为公司在招聘普工,是真是假
感冒怎么办?
我想找到家住黑河市,丁洪军,男,出生1983年
金潮轩食府这个地址在什么地方,我要处理点事
vivox5sl手机便签怎么加密?
瑞丰银行多少贷款金额不需要担保人
男朋友个很长时间见面会扑过来抱我亲我
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?