标题:字符串输入的16进制转换10进制编程的一些问题
只看楼主
点灯工程师
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-9-26
结帖率:100%
已结贴  问题点数:20 回复次数:5 
字符串输入的16进制转换10进制编程的一些问题
输入的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);
    }
}
搜索更多相关主题的帖子: 输入 字符串 int res 进制 
2020-09-26 17:15
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:8 
看代码 取值范围是int
%x输入 %d输出就可以了

https://zh.
2020-09-26 18:42
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:12 
我用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里的函数。

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-09-26 22:27
点灯工程师
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-9-26
得分:0 
回复 2楼 lin5161678
大神的操作总是那么秀,我还是太菜了
2020-09-27 09:16
点灯工程师
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-9-26
得分:0 
回复 3楼 纯蓝之刃
讲得很详细,受教了,我会注意这些问题的,谢谢大神!
2020-09-27 09:19
星泪成寒
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:75
专家分:539
注 册:2013-5-19
得分:0 
程序代码:
#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);


}
2020-09-27 15:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503287-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.236352 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved