实验7-3-6 字符串转换成十进制整数 (15分)

十六进制字符包括0~9 和 a~f(在本道题中规定不分大小写)

解题思路

  1. 循环输入一字符串,当出现‘#’时退出输入。
  2. 设置两个标志位,分别记录第一个负号出现的位置和第一个十六进制出现的位置。(如果第一个十六进制字符之前出现大于一个“-”,同样按照一个处理,当作负数)
  3. 比较两个位置的大小,判断结果是否为负数。
  4. 输出结果
#include<stdio.h>
#define N 1000
//思路:设置两个标志位,分别记录第一个负号出现的位置和第一个十六进制出现的位置(用于判断正负)
//      比较两个位置的大小,判断结果是否为负数。
//      十六进制换算成十进制,设置一个变量temp=1,然后更新temp *= 16,得到相应的结果。
int main()
{
	char ch;
	int len1=0,len2=0;
	char str1[N];//输入的所有字符串
	char str2[N];//筛选出所有的十六进制字符存储
	int str3[N];//把str2字符数组中的数字字符转化成数字
	int index1,index2;
	int cnt1=0;
	int temp=1;
	int sum=0;
//将输入的字符传入str1
	ch=getchar();
	for(int i=0;ch!='\n';i++){
        str1[i]=ch;
        len1++;//输入的字符串的长度
        ch=getchar();
	}
	//遍历寻找第一个负号“-”的位置
	for(int j=0;j<len1;j++){
        if(str1[j]=='-'){
            index1=j;
            break;
        }
	}
	//遍历寻找第一个十六进制数的位置
	for(int k=0;k<len1;k++){
        if((str1[k]>='0'&&str1[k]<='9')||(str1[k]>='a'&&str1[k]<='f')||(str1[k]>='A'&&str1[k]<='F')){
            index2=k;
            break;
        }
	}
	//遍历筛选将所有十六进制字符存入字符数组str2
	for(int k=0;k<len1;k++){
         if((str1[k]>='0'&&str1[k]<='9')||(str1[k]>='a'&&str1[k]<='f')||(str1[k]>='A'&&str1[k]<='F')){
             str2[cnt1++]=str1[k];
         }
	}
	//将所有十六进制数转换成数字
	for(int i=0;i<cnt1;i++){
        if(str2[i]>='0'&&str2[i]<='9'){
            str3[i]=str2[i]-'0';
        }
        else if(str2[i]>='a'&&str2[i]<='f'){
            str3[i]=str2[i]-'a'+10;
        }
        else if(str2[i]>='A'&&str2[i]<='F'){
            str3[i]=str2[i]-'A'+10;
        }
	}
	//将str3字符数组中所有十六进制数全部转换为十进制
	//从个位往高位走
	for(int j=cnt1-1;j>=0;j--){
        sum+=temp*str3[j];
        temp*=16;
	}
	//输出
	if(index1<index2){
        printf("-%d\n",sum);
	}
	else if(index1>index2){
         printf("%d\n",sum);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值