题目:输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
源码:
#include <stdio.h>
int main(void)
{
char str_old[81],str_new[81];
int i = 0,j,flag = 0,temp; //flag用来表示是否有负号存在,0表示负数,1表示正数
long sum = 0;
while((str_old[i] = getchar()) != '#')
i++; //输入一个以'#'结束的非空字符串
str_old[i] = '\0';
for(i = 0;str_old[i] != '\0';i++)
if(str_old[i] == '-')
{
temp = i;
break;
} //找到第一个'-'出现的位置,用temp保存
for(i = 0;i < temp;i++)
{
if((str_old[i] >= '0' && str_old[i] <= '9')||(str_old[i] >= 'a' && str_old[i] <= 'f')||(str_old[i] >= 'A' && str_old[i] <= 'F'))
{
flag = 1;
break;
}
} //遍历字符串至temp,如果第一个'-'之前存在十六进制数字,那么'-'无效,该数为正
for(i = 0,j = 0;str_old[i] != '\0';i++)
{
if((str_old[i] >= '0' && str_old[i] <= '9')||(str_old[i] >= 'a' && str_old[i] <= 'f')||(str_old[i] >= 'A' && str_old[i] <= 'F'))
{
str_new[j] = str_old[i];
j++;
}
} //滤去所有与十六进制数无关的字符
str_new[j] = '\0';
for(j = 0;str_new[j] != '\0';j++)
{
if(str_new[j] >= '0' && str_new[j] <= '9')
sum = 16 * sum + str_new[j] - '0';
else if(str_new[j] >= 'a' && str_new[j] <= 'f')
sum = 16 * sum + str_new[j] - 'a' + 10;
else if(str_new[j] >= 'A' && str_new[j] <= 'F')
sum = 16 * sum + str_new[j] - 'A' + 10;
} //十六进制转化为十进制数
if(flag == 0)
sum = -sum;
printf("%ld",sum);
return 0;
}
版权声明:本文为yjwjwjw原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。