如何在c中将十六进制字符串转换为十进制

问题描述 投票:0回答:1

所以我一直在学习 kernighan 和 ritchie 的 C 编程语言 在第二章中,我练习了2.3 htoi函数,将十六进制字符串转换为等效整数值问题。我看到了很多方法来实现这一目标,而不是复制我尝试实现自己版本的解决方案的解决方案。我仍然无法找出最短和最简单的方法来做到这一点,并尝试实现可选的“0x”或“Ox”场景。下面是我的代码

我如何实现可选的“0x”?

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

char *  reverse(char s[]){
    int len = strlen(s);
    char *r = (char * ) malloc(len + 1 );;
    int k=0;
    for(int i = len; i> 0; i--){
        r[k] = s[i-1];
        k++;
    }
    r[k] = '\0';
    return r;
}


int check_valid(char *s){
    int valid = 0;
    int not_valid = 0;

    int len  = strlen(s);
    for(int i = 0; i < len;i++){
        if((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'f') ||( s[i] >= 'A' && s[i] <= 'F')){
            valid = 1;
        }
        else
            not_valid = 1;
    }

    if( !not_valid ){
        return 1;
    }
    else
        return 0;
}

int rawint(char c ) {
    if(isalpha(c)){
        return toupper(c) - 'A' + 10;
    }
    else 
        return c - '0';
}

int htoi(char *s){
    char len = strlen(s);
    int power = 1;
    int dec = 0;

    for (int i = 0; i < len ;i ++){
        dec += rawint(s[i]) * power;
        power *= 16;
    }

    return dec;
}

int main(){

    char s[] = "7abc";;
    int check =  check_valid(s);
    char   *    r = reverse(s);


    printf("reversed %s\n",r);      
    if(check){
        int dec = htoi(r);
        printf("%d\n",dec);
    }
    else{
        printf("not OK");
    }

}
c hex decimal
1个回答
0
投票

实现可选的“0x”或“Ox”场景。

当然,OP 的意思是“实现可选的‘0x’或‘0X’场景”。 (数字

'0'
,不是字母
'O'
)。

我如何实现可选的“0x”?

要检查有效性,请添加前导字符是否与 0x、0X 序列匹配的测试。如果是这样,请跳过 2

char

int check_valid(char *s){
  // Add
  if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
    s += 2;
  }

错误

检查

valid
not_valid
,不要将
""
视为有效。

// if( !not_valid ){
if(valid && !not_valid ){
    return 1;

提示:迭代直到找到 null 字符,而不是 2 次向下传递字符串。

//int len  = strlen(s);
//for(int i = 0; i < len;i++){
for(int i = 0; s[i]; i++){
© www.soinside.com 2019 - 2024. All rights reserved.