16进制数转换为十进制数-c

结果不对


#include 
#define MAX 1000  //一个十六进制的最大位数 
int main(){
    int cov(char s[]);
    char num[MAX];  //输入的16进制数 (字符)     
    int i=0;
    char c; //接收输入的字符 
    printf("input a hex number:");
    while((c=getchar())!='\0'){      //  一个一个字符 
        if(c>='0'&&c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F'){
            num[i++]=c;
        }
        else {
            num[i]='\0';
            printf("decimal number:%d\n",cov(num));    
                
        } 
    
    }    

    return 0;
}

int cov(char s[]){
    int i,n=0;
    for(i=0;s[i]!='\0';i++){
        if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'\0';
        if(s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10;
        if(s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10;
    }
    return n;
}

注意区分'\0'和'0',你应该减去'0'

        if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0';

这段代码可以工作,但存在一些问题。

首先,在while循环中,当输入到字符串末尾时应该使用EOF而不是'\0'来检查输入结束。因为在输入时,除非你手动在输入中添加一个空字符'\0',否则它永远不会被键盘输入,所以while循环不会停止。可以将这一行代码修改为:

while((c=getchar())!=EOF){

其次,在函数cov()中的if语句中的计算公式不正确。应该使用s[i]-'0'而不是s[i]-'\0',因为字符'0'的ASCII码是48,而字符'\0'的ASCII码是0。所以,这一行代码应该修改为:

if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0';

最后,对于十六进制数的位数,需要在定义num数组的时候指定其大小,否则可能导致数组越界。可以将定义num数组的这一行代码修改为:

char num[MAX+1]; //输入的16进制数(字符),注意需要额外一个位置来存储'\0'字符

修改后的代码如下所示:

#include <stdio.h>
#define MAX 1000  //一个十六进制的最大位数 

int cov(char s[]);

int main(){
    char num[MAX+1];  //输入的16进制数(字符),注意需要额外一个位置来存储'\0'字符
    int i=0;
    char c; //接收输入的字符 

    printf("input a hex number:");
    while((c=getchar())!=EOF){ //当输入到字符串末尾时,应该使用EOF而不是'\0'来检查输入结束
        if(c>='0'&&c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F'){
            num[i++]=c;
        }
        else {
            num[i]='\0';
            printf("decimal number:%d\n",cov(num));    
            break; //加入break语句,结束while循环
        } 
    }    
    return 0;
}

int cov(char s[]){
    int i,n=0;
    for(i=0;s[i]!='\0';i++){
        if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0'; //修改if语句中的计算公式
        if(s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10;
        if(s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10;
    }
    return n;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^