《C程序设计语言》 练习2-3
问题描述
练习2-3 编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的整形值。字符串中允许包含的数字包括:0 ~ 9, a ~ f,A ~ F。
Write the function htoi(s) , which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F .
解题思路
1.就是输入十六进制,输出十进制
2.首先写一个函数,把输入读入到一个数组中,我这里用我自己写的getlines实现,你也可以用for+scanf
3.要判断输入的是否是十六进制,字符串只能是0~9、a~f、A~F
4.转换公式:n = n * 16 + result;(后面详细接受这个公式什么意思,怎么推到来的)
代码如下
#include<stdio.h>
#define MAXLEN 1024
#define YES 1//是十六进制
#define NO 0//不是十六进制 int htoi(char array[]);//进制转换函数
int getlines(char array[],int maxlen);//字符串读取函数 int main()
{
int len;//字符串长度
int ten_number;//十进制数
char array[MAXLEN];
while ((len = getlines(array,MAXLEN)) > )
{
ten_number = htoi(array);
printf("%d", ten_number);
putchar('\n');
}
return ;
} int getlines(char array[],int maxlen)
{
int c,i;
for (i = ; i < maxlen- && (c = getchar())!=EOF && c!= '\n'; i++)
{
array[i] = c;
}
if (c=='\n')
{
array[i] = c;
i++;
}
array[i] = '\0';
return i;
} int htoi(char array[])
{
int i,n;
int result=;
int state = YES;//判断是否是十六进制
i = ;
if (array[i] == '')
{
i++;
if (array[i]=='x' || array[i]=='X')
{
i++;
}
}
n = ;
for ( ; state==YES; i++)
{
if (array[i] >= '' && array[i] <= '')
{
result = array[i] - '';
}else if (array[i] >= 'A' && array[i] <= 'F')
{
result = array[i] - 'A' + ;
}else if (array[i] >= 'a' && array[i] <= 'f')
{
result = array[i] - 'a' + ;
}else
{
state = NO;
}
if(state== YES)
{
n = n* + result;
}
}
return n;
OK,我们现在讲一下解题步骤中第四步那个公式的来源:
如果你去百度或谷歌十六进制转换十进制,告诉你的方法都是从十六进制的最右端开始,乘以16的几次方一类的,这个方法适用于人,但是如果用C来实现,显得有点麻烦了,所以我才去了从高位开始转换,就是从最左端
我举个十进制的例子,大家就会豁然开朗了
比如有一个字符串‘2564’,他是十进制
它等于什么?
我们有那个公式来展开2564的话就是这样:
2 * 10 + 5 = 25
25 * 10 + 6 = 256
256 * 10 + 4 = 2564
因为是十进制所以我们乘以10,十六进制我们乘以16
《C程序设计语言》 练习2-3的更多相关文章
- 操作系统和程序设计语言的API使用的字符编码分析
1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...
- python程序设计语言笔记 第一部分 程序设计基础
1.1.1中央处理器(CPU) cpu是计算机的大脑,它从内存中获取指令然后执行这些指令,CPU通常由控制单元和逻辑单元组成. 控制单元用来控制和协调除cpu之外的其他组件的动作. 算数单元用来完成数 ...
- 扩展《C程序设计语言》练习2-3程序通用性
最近开始自学C语言,在看K&R的<C程序设计语言>.练习2-3要求写一个函数,将输入的十六进制数字字符串转换成与之等价的整数值,配套答案没有扩展程序的通用性,所以我就稍微改造改造. ...
- 清风注解-Swift程序设计语言:Point11~15
目录索引 清风注解-Swift程序设计语言 Point 11. 数值型字面量 代码事例: let decimalInteger = // 十进制的17 let binaryInteger = 0b10 ...
- 清风注解-Swift程序设计语言:Point6~10
目录索引 清风注解-Swift程序设计语言 Point 6. 输出常量和变量 代码事例: // 输出的内容会在最后换行 println("hello, world") // 输出的 ...
- 清风注解-Swift程序设计语言:Point1~5
目录索引 清风注解-Swift程序设计语言 Point 1. Swift 风格的"Hello, world" 代码事例: println("Hello, world&qu ...
- 清风注解-Swift程序设计语言
前言 Apple 发布了全新的 Swift 程序设计语言,用来开发 iOS 和 OS X 平台的应用程序.其目的不言而喻:就是为了给老迈的 Objective-C 一个合适接班人!因此,不难预见,未来 ...
- C程序设计语言(第二版)习题:第一章
第一章虽然感觉不像是个习题.但是我还是认真去做,去想,仅此而已! 练习 1-1 Run the "hello, world" program on your system. Exp ...
- Oberon程序设计语言简介
Oberon奥伯龙是一种通用编程语言,也是一种同名操作系统(由Oberon语言开发,且参考过贝尔实验室的新一代网络操作系统Plan9),是由原Pascal程序设计语言的发明者Niklaus Wirth ...
- awk程序设计语言之-awk基础
awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...
随机推荐
- [算法总结]康托展开Cantor Expansion
目录 一.关于康托展开 1.什么是康托展开 2.康托展开实现原理 二.具体实施 1.模板 一.关于康托展开 1.什么是康托展开 求出给定一个由1n个整数组成的任意排列在1n的全排列中的位置. 解决这样 ...
- 天天在用Redis,持久化方案你又知道哪些?
前言 文章首发于微信公众号[码猿技术专栏]:天天用Redis,持久化方案有哪些你知道吗? Redis目前已经成为主流的内存数据库了,但是大部分人仅仅是停留在会用的阶段,你真的了解Redis内部的工作原 ...
- cwyth(自动核销代码)
财务一体化系统,自动核销大数据代码: import pymysql import random import time #指定数据库地址.用户.密码.端口,使用connect()方法声明一个Mysql ...
- 分析 Nanocore
Nanocore是一个非常强大的木马控制系统,当Nanocore木马运行时,我们发现Windows Defender可以很好地识别威胁.本文的目的是分析Nanocore的传播方式,它是怎样感染Wind ...
- CTO的窘境
做CTO太难了,常年的coding思维让你早已与世隔绝,CTO有很好的技术方案,但CEO.CFO等O听不懂是很麻烦的事.总得来说,做CTO一定要技术背景出身,有很强的沟通能力和情商,敏锐的洞察力和决断 ...
- Java集合:ArrayList (JDK1.8 源码解读)
ArrayList ArrayList几乎是每个java开发者最常用也是最熟悉的集合,看到ArrayList这个名字就知道,它必然是以数组方式实现的集合 关注点 说一下ArrayList的几个特点,也 ...
- php sprintf() 函数把格式化的字符串写入一个变量中。
来源:https://blog.csdn.net/zxh1220/article/details/79709207 HP sprintf() 函数用到的参数 printf — 输出格式化字符串 spr ...
- JQ获取select上的option的data-start和data-id
来源:https://zhidao.baidu.com/question/692142321436883524.html 静态的写法: 用jq的attr()函数,如: HTML: <select ...
- 2019-2020-1 20199325《Linux内核原理与分析》第六周作业
正常的使用gdb跟踪分析函数调用 使用make rootfs命令 *用gdb跟踪分析一个系统调用内核函数 对于宏SAVE_ALL来说,这条语句会保存当前线程的现场,然后是执行system_call,跳 ...
- KVM基本功能管理
一.KVM基础功能管理 1.查看命令帮助 virsh -h 2.查看 KVM 的配置文件存放目录(CENTOS7.0.xml是虚拟系统实例的配置文件) ls /etc/libvirt/qemu ...