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

一.题目:从键盘输入一个字符串,去掉所有非十六进制字符后转换成十进制数输出。读懂以下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;
}

四.编译运行

从结果可以看出,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;
}

七.编译运行

这是肿么回事?

八.贴出网上解答方法

#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有区别吗?

C语言每日一题之No.6的更多相关文章

  1. C语言每日一题之No.1

    鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C ...

  2. C语言每日一题之No.9

    再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规 ...

  3. C语言每日一题之No.8

    正式面对自己第二天,突然一种强烈的要放弃的冲动,在害怕什么?害怕很难赶上步伐?害怕这样坚持到底是对还是错?估计是今天那个来了,所以身体激素有变化导致情绪起伏比较大比较神经质吧(☆_☆)~矮油,女人每个 ...

  4. C语言每日一题之No.4

    这几天老大也没安排我什么项目,于是想正好趁着空补C.当然,是利用晚上加班时间,白天正常上班时间还是学习公司的平台. 今儿个突然弱弱的感觉到在公司补C是件很低级的事情,哪怕是在加班时间都会被喷,因为大家 ...

  5. C语言每日一题之No.3

    几天下来,感慨学习要坚持下来真的是件很难的事,本来说了每天一题,可是毕竟这是个细活,需要用心雕琢,有时候真的不能当天拿下来>_<.虽然说只是一题,却涉及到很多小细节,慢慢的琢磨直至完全摸透 ...

  6. C语言每日一题之No.12

    文件操作知识:如何将一个文件的内容读取到另一个文件里? fread函数和fwrite函数   1.函数功能   用来读写一个数据块. 2.一般调用形式   fread(buffer,count,siz ...

  7. C语言每日一题之No.7

    今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观 ...

  8. C语言每日一题之No.5

    总在想,但凡编程基础正常点,都不至于惨败到这个地步.也像大多数人毕业出来,新鲜的第一份工作,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界 ...

  9. C语言每日一题之No.2

    题目:已知三个整型数8,12,6,按公式s=a+b*c计算,并显示结果 思路:定义三个整型变量a,b,c 定义一个变量s用来保存运算结果 输出 程序: #include <stdio.h> ...

随机推荐

  1. 使用Jmeter测试MySQL性能——(1)连接配置

    在搭建MySQL集群之后需要测试集群的性能究竟如何,采用Apache的测试工具Jmeter进行测试,本文主要介绍主要实现Jmeter配置连接到MySQL. 安装相应的软件 首先Jmeter是基于Jav ...

  2. 递归神经网络之理解长短期记忆网络(LSTM NetWorks)(转载)

    递归神经网络 人类并不是每时每刻都从头开始思考.正如你阅读这篇文章的时候,你是在理解前面词语的基础上来理解每个词.你不会丢弃所有已知的信息而从头开始思考.你的思想具有持续性. 传统的神经网络不能做到这 ...

  3. JS的跨域问题

    1.什么是跨域? 跨域问题是由于javascript语言安全限制中的同源策略造成的. 2.什么是同源策略: 同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名.协议 ...

  4. HDU 4497 数论+组合数学

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4497 解题思路:将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y' ...

  5. linux ssh免密码登录设置

    ssh-keygen -t rsa 全部回车 生成密钥默认放在了/root/.shh中 打开它 cd /root/.ssh cp id_rsa.pub authorized_keys 免密码登录 现在 ...

  6. N皇后回溯解法 leetcode N-Queens

    class Solution { public: vector<vector<string> > solveNQueens(int n) { vector<vector& ...

  7. apache开启url rewrite模块

    在把服务器数据转移到本地服务器之后,本地打开首页出现排版紊乱等问题,经过大神指点说是url rewrite的问题. 本篇文章主要写怎样开启apache的url rewrite功能. 打开Apache2 ...

  8. 课堂所讲整理:HTML--8Window.document对象

    1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个:    var a =docunmen ...

  9. 这个代码怎么改??Help快速排序 quicksort

    #include<stdio.h>int a[101],n;void quicksort(int left,int right){     int i,j,t,temp;     if(l ...

  10. 另一个分区工具GNU的parted[转自vbird]

    利用 GNU 的 parted 进行分割行为 虽然你可以使用 fdisk 很快速的将你的分割槽切割妥当,不过 fdisk 却无法支持到高于 2TB 以上的分割槽! 此时就得需要 parted 来处理了 ...