最近开始自学C语言,在看K&R的《C程序设计语言》。练习2-3要求写一个函数,将输入的十六进制数字字符串转换成与之等价的整数值,配套答案没有扩展程序的通用性,所以我就稍微改造改造。

  配套的答案是这样的(自己添加了注释):

 #define YES    1
#define NO 0 /* htoi:将十六进制数字字符串转换成十进制数
* 如果发现'0x'或'0X'则跳过并设置十六进制数的起点
* 检查后续字符是否是0-9,a-f或是A-F
* 如果是则将其转换为整形
* 如果不是则停止检查,数字结束
* 通过公式计算相应的十进制值并返回
*/
int htoi(char s[])
{
int hexdigit,i,inhex,n; if (s[i] == '') {
++i;
if (s[i] == 'x' || s[i] == 'X'){
++i;
}
}
n = ; /* 初始化返回变量 */
inhex = YES; /* 假设在合法字符中 */
for ( ; inhex == YES; ++i) {
if (s[i] >= '' && s[i] <= '')
hexdigit = s[i] - '';
else if (s[i] >= 'a' && s[i] <= 'f')
hexdigit = s[i] - 'a' + ;
else if (s[i] >= 'A' && s[i] <= 'F')
hexdigit = s[i] - 'A' + ;
else
inhex = NO;
if (inhex == YES)
n = * n + hexdigit;
}
return n;
}

  该函数需要导入一个字符数组,我在 main() 函数中写了获取数组的代码将获取字符数组的代码写成(假设最多获取10个长度的字符数组,因为数组以 '\0' 结尾,因此总共最多获取9个有效字符):

 int c,i;
char input[]; for ( i = ; i < - && ((c = getchar()) != EOF); ++i)
input[i] = c;
input[i] = '\0';

  将得到的字符数组传入 htoi() 函数中即可计算出转换后的值。

  但是这样有个缺陷:字符数组开头必须是 “0x” 或 “0X” 或 数字0-9 或 字母a-f 或 A-F,否则 htoi() 函数只返回 0。这样就降低了程序的通用性,那么如何才能当字符数组前头包含无用字符时,只有检测到 “0x” 或 “0X” 时才继续检测后续字符,并计算返回正确的结果?

  我的做法是在 htoi() 函数中检测是否为 “0x” 或 “0X” 的代码上添加循环:

 int htoi(char s[])
{
int hexdigit,i,inhex,n; i=;
while (s[i] != '\0'){
if (s[i] == '') {
++i;
if (s[i] == 'x' || s[i] == 'X'){
++i;
break; /* 如果是“0x”或“0X”就停止循环 */
}
}
else
++i; /* 如果不符合则循环到底,最后s[i]='\0' */
}
n = ;
inhex = YES;
for ( ; inhex == YES; ++i) {
... ...

  运行结果如下:

  下面把完整代码贴出来,若有幸让高手看见还请指点指点:

 #include <stdio.h>

 #define YES    1
#define NO 0 int htoi(char s[]); int main(void)
{
int c,i;
char input[]; for ( i = ; i < - && ((c = getchar()) != EOF); ++i)
input[i] = c;
input[i] = '\0';
printf("输入的16进制数转换十进制数:%d\n",htoi(input));
return ;
} int htoi(char s[])
{
int hexdigit,i,inhex,n; i=;
while (s[i] != '\0'){
if (s[i] == '') {
++i;
if (s[i] == 'x' || s[i] == 'X'){
++i;
break;
}
}
else
++i;
}
n = ;
inhex = YES;
for ( ; inhex == YES; ++i) {
if (s[i] >= '' && s[i] <= '')
hexdigit = s[i] - '';
else if (s[i] >= 'a' && s[i] <= 'f')
hexdigit = s[i] - 'a' + ;
else if (s[i] >= 'A' && s[i] <= 'F')
hexdigit = s[i] - 'A' + ;
else
inhex = NO;
if (inhex == YES)
n = * n + hexdigit;
}
return n;
}

2015.06.16更新  

根据 @garbageMan 的建议:

1.将获取字符数组的代码封装为函数 getstring()

2.修改 htoi() 函数的判断语句,当字符数组不以 “0x” 或 “0X” 开头时也能进行计算

3.简化 htoi() 函数结束循环的标记,去除 inhex 变量

另:

1.将能够获取的字符数组的最大长度定义为常量 MAXC

2.将 htoi() 函数的返回值修改为 double 以容纳更大的结果

完整程序代码如下:

 #include <stdio.h>

 #define MAXC    100        /*    字符数组的最大长度       */

 double htoi(char s[]);
void getstring(char s[]); int main(void)
{
char input[MAXC]; getstring(input);
printf("输入的16进制数转换十进制数:%.0f\n",htoi(input));
return ;
} double htoi(char s[])
{
int hexdigit,i;
double n; i=;
while (s[i] != '\0'){
if (s[i] == '') {
++i;
if (s[i] == 'x' || s[i] == 'X'){
++i;
break;
}
else
break; /* 0之后不是x或X的话则从0开始计算 */
}
/* 是以下符合十六进制的字符则从其开始计算 */
else if((s[i] >= '' && s[i] <= '')
|| (s[i] >= 'a' && s[i] <= 'f')
|| (s[i] >= 'A' && s[i] <= 'F'))
break;
else /* 非十六进制字符,跳过 */
i++;
}
n = 0.0;
for ( ; ; ++i) {
if (s[i] >= '' && s[i] <= '')
hexdigit = s[i] - '';
else if (s[i] >= 'a' && s[i] <= 'f')
hexdigit = s[i] - 'a' + ;
else if (s[i] >= 'A' && s[i] <= 'F')
hexdigit = s[i] - 'A' + ;
else
break;
n = * n + hexdigit;
}
return n;
} /* 获取字符数组 */
void getstring(char s[])
{
int c,i; for ( i = ; i < MAXC- && ((c = getchar()) != EOF); ++i)
s[i] = c;
s[i] = '\0';
}

扩展《C程序设计语言》练习2-3程序通用性的更多相关文章

  1. python程序设计语言笔记 第一部分 程序设计基础

    1.1.1中央处理器(CPU) cpu是计算机的大脑,它从内存中获取指令然后执行这些指令,CPU通常由控制单元和逻辑单元组成. 控制单元用来控制和协调除cpu之外的其他组件的动作. 算数单元用来完成数 ...

  2. MOOC 编译原理笔记(一):编译原理概述以及程序设计语言的定义

    编译原理概述 什么是编译程序 编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序. 高级语言程序-翻译->机器语言程序-运行->结果. 其中编译程 ...

  3. Oberon程序设计语言简介

    Oberon奥伯龙是一种通用编程语言,也是一种同名操作系统(由Oberon语言开发,且参考过贝尔实验室的新一代网络操作系统Plan9),是由原Pascal程序设计语言的发明者Niklaus Wirth ...

  4. awk程序设计语言之-awk基础

    awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...

  5. c++学习书籍推荐《C++程序设计语言(特别版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计语言(特别版•十周年中文纪念版)>编辑推荐:十周年纪念版,体味C++语言的精妙与魅力,享受与大师的心灵对话.1979年,Biarn ...

  6. java语言实现对程序设计语言源文件统计字符数、单词数、行数及其他拓展功。

    本次作业Github项目地址:https://github.com/YiChenglong2018/WordCount 一.项目简介 本项目的需求可以概括为:对程序设计语言源文件统计字符数.单词数.行 ...

  7. 操作系统和程序设计语言的API使用的字符编码分析

     1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...

  8. 利用Scala语言开发Spark应用程序

    Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可 以阅读网络教程A Scala Tutorial for Ja ...

  9. 【HTML/XML 8】XSL,可扩展样式表语言

    导读:上篇博客说了在XML文档中实现表现形式的一种形式:CSS层叠样式表,本篇博客将接着说明其另一种实现方式XSL,并将分析XSL和CSS之间的 关系. 一.XSL简介 XSL(eXtensible ...

随机推荐

  1. 【索引】用PS3手柄在安卓设备上玩游戏系列

    谈安卓游戏对手柄的支持:http://www.cnblogs.com/duxiuxing/p/3729802.html 连接手柄和设备:http://www.cnblogs.com/duxiuxing ...

  2. RAM——[HAOI2007]理想的正方形

    题目:[HAOI2007]理想的正方形 描述: [问题描述] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [输入]: 第一行为3个 ...

  3. 《A First Course in Probability》-chaper5-连续型随机变量-正态分布

    古典统计学问题一开始起源于赌博,让我们看这样一道有关赌博的问题. Q:A.B两人进行n局赌博,A胜的概率是p,现在设置随机变量X表示A赢的局数,当X>np,A给赌场X-np元,否则B给赌场np- ...

  4. Android系统中设置TextView的行间距(非行高)

    Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacin ...

  5. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(2)

    切分语句 软件project的一条定律是数据和代码分离.这样做会使代码更易于測试,即使输入的数据发生改变,你的代码也能够同意.甚至于,程序能在执行中实时下载新的数据.假设程序能在执行中下载新书岂不是更 ...

  6. [Angular 2] NgNonBindable

    If you want to print someting like {{content}} on the html, using ng-non-bindable directive: <div ...

  7. jquery中修改一个元素的值或内容

    jquery中修改一个元素的值或内容,比如数值增加可以使用这个方法取得原值并+1 $this.text(function(i,ot){return Number(ot)+1;});

  8. POJ 2653 Pick-up sticks (判断线段相交)

    Pick-up sticks Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10330   Accepted: 3833 D ...

  9. windows安装服务

    我安装了windows服务的时候监控其他机子的时候,我在调试的时候用的是Account是其他用户是可以正常的,但是安装成服务的时候,老是被拒绝. 后来我将Account改成NetworkService ...

  10. 5事件DOM零级事件跟DOM二级事件

    事件的行为传播,行为本身跟事件绑定没有关系:1.全新认识事件(某一个具体的行为)->行为本身:浏览器天生自带的一些行为操作->click,mouseover(mouseenter),mou ...