c语言 char类型 >和<运算和||运算时出现的问题
答案:2 悬赏:0
解决时间 2021-02-19 10:09
- 提问者网友:空白
- 2021-02-18 21:23
我非常菜,简单的说,要判断一个字符串中的元素是不是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语言不久,所以这个问题可能很菜,但我也上网找过答案的,没有办法才提的这个问题,请不吝赐教。谢谢!
最佳答案
- 二级知识专家网友:萌萌哒小可爱
- 2021-02-18 22:54
应该这样子写,你没搞清楚逻辑关系,应该是先满足条件,然后取反就可以。
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;
}
全部回答
- 1楼网友:浪者不回头
- 2021-02-18 23:50
short是2字节的, 范围-32768-32767, unsigned short是0-65535
short sval=65536; 这个赋值后sval是0,
如果放65535就是-1,
65535放到unsigned short里才是65535
我要举报
大家都在看
推荐资讯