注册 登录
编程论坛 C语言论坛

字符串输入的16进制转换10进制编程的一些问题

点灯工程师 发布于 2020-09-26 17:15, 1899 次点击
输入的16进制是字符串,要求转换为10进制输出。例如输入0xA,输出10。程序如下。
输出结果不对,所以加了temp0和temp1两个变量用来观察,调试时发现,temp0和temp1里不是同一个字符。
另外还发现,如果chs声明得比较大,比如产生chs[100]或者去掉lens = strlen(chs)时,上述两者就一样了,这个问题百思不得其解,求大神指教!!!
程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int main()
{

    char chs[] = "";
    int lens;
    while(scanf("%s",chs) != EOF)
    {
        int res = 0;
        char tmep0 = chs[2];
        lens = strlen(chs);
        char temp1 = chs[2];
        for(int i = 2;i < lens;i++)
        {
            if(chs[i] >= 'A')
                res += (chs[i] - 55)*pow(16,lens-i-1);
            else
                res += (chs[i] - '0')*pow(16,lens-i-1);
        }
        printf("%d\n",res);
    }
}
5 回复
#2
lin51616782020-09-26 18:42
看代码 取值范围是int
%x输入 %d输出就可以了
#3
纯蓝之刃2020-09-26 22:27
我用vs没有出现你说的这两个问题。不过有几个其他的问题需要注意一下:
当char chs[]="";定义的时候要定义足够大的空间,比如char chs[20],否则当你scanf("%s",chs)的时候,chs会内存溢出,导致程序异常终止。
这个程序在十六进制字符串为负的时候是不成立的,如果仅仅是正数,那么int res显然不足够大,数据符号类型也不匹配,建议至少使用unsigned long res,输出用printf("%lu\n",res);
pow()的返回参数是浮点数,如果强制转换成res类型,会将小数点后的数据舍弃,导致计算出错,所以可以res += (chs[i] - 55)*(unsigned long)(pow(16,lens-i-1)+0.1);实现,或者自己编写int类型的pow函数,不用math.h里的函数。
#4
点灯工程师2020-09-27 09:16
回复 2楼 lin5161678
大神的操作总是那么秀,我还是太菜了
#5
点灯工程师2020-09-27 09:19
回复 3楼 纯蓝之刃
讲得很详细,受教了,我会注意这些问题的,谢谢大神!
#6
星泪成寒2020-09-27 15:18
程序代码:

#include <stdio.h>
#include <string.h>

#define _NG 0xFF
const unsigned char g_hex_charset[] = {
/* 0x00~0x0F */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x10~0x1F */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x20~0x2F */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x30~0x3F */0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x40~0x4F */_NG, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x50~0x5F */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x60~0x6F */_NG, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x70~0x7F */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x80~0x8F */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0x90~0x9F */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0xA0~0xAF */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0xB0~0xBF */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0xC0~0xCF */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0xD0~0xDF */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0xE0~0xEF */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG,
/* 0xF0~0xFF */_NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG, _NG
};
#define hexval(_idx) g_hex_charset[(_idx)]

#ifdef __DEBUG
#define _DBG(fmt, ...) printf("[%s:%d]"fmt"\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define _DBG(fmt, ...)
#endif

int con_16_to_10(char* str)
{
    int i, tmp, bits, result = 0;
    int len = strlen(str);

    if (len < 3) {
        _DBG();
        return -1;
    }

    if ((str[0] != '0') || ((str[1]|0x20) != 'x')) {
        _DBG();
        return -1;
    }

    for (i = len - 1; i > 1; i--) {
        tmp = hexval(str[i]);
        if (tmp == _NG) {
            _DBG("invalid char: %c", str[i]);
            return -1;
        }
        bits = (len - 1 - i) * 4;
        result += tmp * (bits?(1 << bits):1);
        _DBG("tmp=%dx2^%d, result=%d\n", tmp, bits, result);
    }

    return result;
}

int main(void)
{
    int value;
    char str[100];
    scanf("%s", str);
    value = con_16_to_10(str);

    printf("%d\n", value);


}
1