PTA习题 字符串转换成十进制整数

题目:输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
题目详情
源码:

#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版权协议,转载请附上原文出处链接和本声明。