练习2-3 编写函数 htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x 或0X)转换为与之等价的整型值。字符串中允许包含的数字包括:0~9、a~f以及A~F。
转换 函数 字符串 以及 数字 编写 练习 包含
2023-09-14 09:06:57 时间
C语言程序设计(第二版) 练习2-3 个人设计
练习2-3 编写函数 htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值。字符串中允许包含的数字包括:0~9、a~f以及A~F。
代码块:
方法1
#include <stdio.h>
#include <stdlib.h>
int htoi (char s[]);
int main()
{
char s[]="0xA2F";
printf("%d\n", hoti(s));
system("pause");
return 0;
}
int hoti (char s[]) /*十六进制转换函数*/
{
int i, n, num; /*定义循环变量,中间变脸,最终转换值*/
num=0; /*以下两行为变量设置初始值*/
i=0;
if (s[i]=='0'){ /*以下四行为判断是否为十六进制数值,以0x或0X开头作为条件*/
++i;
if (s[i]=='x'||s[i]=='X'){
++i;
for (; s[i]!='\0'; ++i){ /*判断字符串是否结束并循环*/
if (s[i]>='0'&&s[i]<='9') /*如果字符为数字,转换为相应值*/
n=s[i]-'0';
if (s[i]>='A'&&s[i]<='Z') /*如果字符为大写字母,转换为相应值*/
n=s[i]-55;
if (s[i]>='a'&&s[i]<='z') /*如果字符为小写字母,转换为相应值*/
n=s[i]-87;
num=num*16+n; /*循环求值*/
}
}
}
return num;
}
方法2
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
void htoi(char s[]); //定义十六进制转换函数
void input(char s[]); //定义输入函数
void error(); //定义错误函数
int main()
{
char string[100];
input(string); //调用输入函数
htoi(string); //调用十六进制转换函数
system("pause");
return 0;
}
/*输入函数*/
void input(char s[])
{
printf("Please enter string: ");
gets(s);
int i;
for(i=0; s[i]!='\0'; i++){ //22-33行,判断输入字符的前两位是否为十六进制符号
if (s[0]!='0'){
error();
input(s);
}
if (s[1]!='x'&&s[1]!='X'){
error();
input(s);
}
else
break;
}
for(i=2; s[i]!='\0'; i++) //34-38行,判断后面输入的字符是否是十六进制数字
if (s[i]<'0'||(s[i]>'9'&&s[i]<'A')||(s[i]>'F'&&s[i]<'a')||s[i]>'f'){
error();
input(s);
}
}
/*错误函数*/
void error()
{
printf("Error!Retry!\n");
}
/*十六进制转换函数*/
void htoi(char s[])
{
int i, j, k, len, num[100];
double total=0.0;
len=strlen(s)-2;
for (i=2, j=0; s[i]!='\0'; i++){
if (s[i]>='0'&&s[i]<='9')
num[j++]=s[i]-'0';
else if ((s[i]>='A'&&s[i]<='F')||(s[i]>='a'&&s[i]<='f')){
switch(s[i]){
case 'A':
case 'a': num[j++]=10; break;
case 'B':
case 'b': num[j++]=11; break;
case 'C':
case 'c': num[j++]=12; break;
case 'D':
case 'd': num[j++]=13; break;
case 'E':
case 'e': num[j++]=14; break;
case 'F':
case 'f': num[j++]=15; break;
default: break;
}
}
}
for (i=0, k=len-1; i<j||k>=0; i++, k--)
total+=num[i]*pow(16.0, k);
printf("Result=%.0lf\n", total);
}
如果程序设计有错误或更简洁的方法,欢迎并感谢您指正出示,谢谢!
相关文章
- Oracle字符函数(转换大小写,替换等)
- C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)
- lua 时间戳和时间互相转换
- Python不使用int()函数把字符串转换为数字
- C#中的Byte,String,Int,Hex之间的转换函数。
- String() 函数把对象的值转换为字符串。
- 405. 数字转换为十六进制数 ——【Leetcode每日一题】
- OpenCV每日函数 杂项图像转换模块 (1) adaptiveThreshold自适应阈值函数
- OpenCV每日函数 杂项图像转换模块 (4) floodFill洪水填充函数
- 使用showdown.js将Markdown文档转换为HTML
- Image与Bitmap的区别及相互转换
- DataScience之boxcox:scipy.stats.boxcox函数的简介、案例应用(将非正态分布数据转换为正态分布数据)之详细攻略
- 错误 不存在从 “std::string“ 到 “LPCSTR“ 的适当转换函数
- 练习 3-5 编写函数itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中。
- 练习2-10 重新编写将大写字母转换为小写字母的函数lower,并用条件表达式替代其中的if-else结构。
- OpenLayers学习笔记2——坐标转换问题
- CSS3转换属性—transform之translate、rotate、scale函数详解
- 十一、CANdelaStudio入门-Dependencies状态转换图无法查看
- 自己给基因组注释 geo自建函数 id转换 探针转换 实现表达矩阵expr 与注释文件ids探针名称转换 留下平均表达值最大的那个探针对应的基因 注释包没有线粒体基因 没注释到线粒体基因
- 【牛客网刷题系列 之 Verilog快速入门】~ 使用函数实现数据大小端转换
- VL10 使用函数实现数据大小端转换