zl程序教程

您现在的位置是:首页 >  其他

当前栏目

练习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);
}

如果程序设计有错误或更简洁的方法,欢迎并感谢您指正出示,谢谢!