C语言每日一题之No.6

人总要战胜内心的懦弱的,我不能一直这么缩在里边。终究向自己发出了挑战,还是会伤心的时候,发愣的时候。如果可以,我也希望像盗梦空间的女主一直沉在两个人的梦里永远不要醒来。可是,我们谁又能抗拒时间呢?这雨猛烈的下,下了一天,有时候突然好大的打雷声,有点怕。还是晴吧,天晴了,阳光灿烂的多好啊

一.题目:从键盘输入一个字符串,去掉所有非十六进制字符后转换成十进制数输出。读懂以下main函数,编

写相应的函数del16和htod。

 #include<stdio.h>
#include<string.h>
void main()
{
char s1[],s2[];
void del16(char *p1,char *p2);
long htod(char *p);
gets(s1); //读入一字符串
del16(s1,s2); //去掉所有非十六进制字符到s2
printf("%d\n",htod(s2)); //把s2转换为10进制
}

二.思路 :十六进制字符指的是0~f或者大写0~F的字符

将字符串中0~f或者大写0~F的字符存到另一个字符数组里

将十六进制字符转换成十进制数输出

三.程序

 #include <stdio.h>

 int main(void)
{
char s1[],s2[];
void del16(char *p1,char *p2);
long htod(char *p);
gets(s1); //读入一字符串
del16(s1,s2); //去掉所有非十六进制字符到s2
printf("%s",s2);
printf("%d\n",htod(s2)); //把s2转换为10进制 return ;
} void del16(char *p1,char *p2)
{
while(*p1)
{
if((*p1 >='' && *p1<='')||(*p1>='a' && *p1<='f')||(*p1>='A' && *p1<='F'))
{
*p2=*p1;
p2++;
}
p1++; } } long htod(char *p)
{
int sum = ;
while(*p)
{
if(*p>=''&&*p<='')
sum = sum* + (*p-'');
else if(*p>='a' &&*p<='f')
sum = sum* + (*p-'a'+);
else if(*p>='A' && *p<='F')
sum = sum* + (*p-'A'+);
}
return sum;
}

四.编译运行

C语言每日一题之No.6

从结果可以看出,s2的获取出了问题,后面那一串“烫烫?23abwxydf”怎么出来的?

五.分析问题

1.检查函数del16(char *p1,char *p2),发现指向字符型数据的指针p2在结尾处没有添加字符串结束符‘\0’,记住,这是字符串,获取的字符串,要人为的添加结束符

 void del16(char *p1,char *p2)
{
while(*p1)
{
if((*p1 >='' && *p1<='')||(*p1>='a' && *p1<='f')||(*p1>='A' && *p1<='F'))
{
*p2=*p1;
p2++;
}
p1++;
*p2 = '\0'; } }

2.在十六进制转换成十进制时,'0'~'9'是小于10的数,sum的权重是10。但是'a'~'f'肯定是大于10的数,也就是两位数了,那么sum的权重就不该是10了,而应该是100才对。  另外,还有个地方被忽略了,就是指针的移动:忘了p++。这个地方已经不止一次被我给漏掉了,要引以为戒。

 long htod(char *p)
{
int sum = ;
while(*p)
{
if(*p>=''&&*p<='')
sum = sum* + (*p-'');
else if(*p>='a' &&*p<='f')
sum = sum* + (*p-'a'+);
else if(*p>='A' && *p<='F')
sum = sum* + (*p-'A'+);
p++;
}
return sum;
}

六.改进

 #include <stdio.h>

 int main(void)
{
char s1[],s2[];
void del16(char *p1,char *p2);
long htod(char *p);
gets(s1); //读入一字符串
del16(s1,s2); //去掉所有非十六进制字符到s2
printf("%s\n",s2);
printf("%d\n",htod(s2)); //把s2转换为10进制 return ;
} void del16(char *p1,char *p2)
{
while(*p1)
{
if((*p1 >='' && *p1<='')||(*p1>='a' && *p1<='f')||(*p1>='A' && *p1<='F'))
{
*p2=*p1;
p2++;
}
p1++;
*p2 = '\0';
} } long htod(char *p)
{
int sum = ;
while(*p)
{
if(*p>=''&&*p<='')
sum = sum* + (*p-'');
else if(*p>='a' &&*p<='f')
sum = sum* + (*p-'a'+);
else if(*p>='A' && *p<='F')
sum = sum* + (*p-'A'+);
p++;
}
return sum;
}

七.编译运行

C语言每日一题之No.6

C语言每日一题之No.6

这是肿么回事?

八.贴出网上解答方法

#include<stdio.h>
#include<string.h>
void main()
{
char s1[],s2[];
void del16(char *p1,char *p2);
long htod(char *p);
gets(s1); //读入一字符串
del16(s1,s2); //去掉所有非十六进制字符到s2
printf("%d\n",htod(s2)); //把s2转换为10进制
}
void del16(char *p1,char *p2)
{
while(*p1)
{
   if(*p1<='f'&&*p1>='a'||*p1<='F'&&*p1>='A'||*p1<=''&&*p1>='')
*p2++=*p1;
p1++;
}
*p2='\0';
}
long htod(char *p)
{
long sum=;
while(*p)
{
if(*p<='f'&&*p>='a') sum=sum*+*p-'a'+;
else if(*p<='F'&&*p>='A') sum=sum*+*p-'A'+;
else if(*p<=''&&*p>='') sum=sum*+*p-'';
p++;
}
return sum;
}

九.对比了网上的解答

1.很显然在换算时由于是16进制换算成十进制,所以sum理所当然的权重为16而不是10或者100。但问题是,用

10或者100怎么会出现上面那种溢出的情况呢?

2.在函数del16(char *p1,char *p2)里,直接p2 = p1有什么不可以的?这和*p2 = *p1有区别吗?

上一篇:【HDOJ 2888】Check Corners(裸二维RMQ)


下一篇:C语言每日一题之No.2