Convert long integer(decimal) to base 36 string (strtol inverted function in C)

前端 未结 3 2210
执笔经年
执笔经年 2020-12-20 22:11

I can use the strtol function for turning a base36 based value (saved as a string) into a long int:

long int val = strtol(\"ABCZX12         


        
3条回答
  •  [愿得一人]
    2020-12-20 22:48

    Here is another option with no need for source array of charaters, but less portable since not all character encodings have contiguous alphabetic characters, for example EBCDIC. Test HERE

    #include  
    #include  
    #include 
    #include 
    #include 
    
    char get_chars(long long value) 
    { 
        if (value >= 0 && value <= 9) 
            return value + '0'; 
        else
            return value - 10 + 'A'; 
    } 
    
    void reverse_string(char *str) 
    { 
        int len = strlen(str); 
    
        for (int i = 0; i < len/2; i++) 
        { 
            char temp = str[i]; 
            str[i] = str[len - i - 1]; 
            str[len - i - 1] = temp; 
        } 
    } 
    
    char* convert_to_base(char *res, int base, long long input) 
    { 
        bool flag = 0;
        int index = 0;   
        if(input < 0){  
           input = llabs(input);
           flag = 1;
        }
        else if(input == 0){
           res[index++] = '0';
           res[index] = '\0';
           return res;
        }      
           while(input > 0)
           {          
              res[index++] = get_chars(input % base); 
              input /= base; 
        } 
        if(flag){
            res[index++] = '-';
        }       
        res[index] = '\0';   
        reverse_string(res); 
        return res; 
    } 
    
    int main() {  
        long long input = 0;
        printf("** Integer to Base-36 **\n ");
        printf("Enter a valid number: ");
        scanf("%lld", &input); 
        if(input >= LLONG_MAX && input <= LLONG_MIN){
          printf("Invalid number");  
          return 0; 
        }
    
        int base = 36; 
        char res[100]; 
        printf("%lld -> %s\n", input, convert_to_base(res, base, input));
    
        return 0; 
    }
    

提交回复
热议问题