十六進位制字串轉化為十進位制數
阿新 • • 發佈:2019-02-06
#include <stdio.h> #include <string.h> /* 傳進一個整數和次方數 * 返回整數的n次方 */ int power(int num, int n) { int result = 1; if (n == 0){ return result; }else{ while(n > 0){ result *= num; n--; } } return result; } /* 傳進一個以0x或0X開頭的16位數字計數法表示的字串 * 返回十進位制數 */ int htoi(const char *str) { if (NULL == str){ return -1; } int result = 0; int len = (int) strlen(str); int dig = len - 3; //最高位的次方數為n-1 char tmp[len+1]; strcpy(tmp, str); //轉換為10進位制需要有該數的值以及次方 //字串長度減去3(0x 和 最高位次方數為 n-1)為十六進位制數最高位次方數 //值用(int)進行型別轉換 //次方用字串長度減去3(0x 和 最高位次方數為 n-1)表示 //計算完一個字元後,跳向下一個字元,次方數減1 //從左往右找到x後的第一個字元 int i = 0; while (tmp[i] != 'x' && tmp[i] != 'X' && i < len){ i++; } //結束後指向x,需要往後挪一位 i++; //此時指向最高位 if (tmp[i] == '\0'){ printf("input error.\n"); return -1; } while (tmp[i] != '\0') { //判斷是否為0-9 if (tmp[i] <= '9' && tmp[i] >= '0'){ //型別轉換為數字,加上次方,賦值給儲存變數 result += ((int) tmp[i] - 48) * power(16, dig); dig--; } //判斷是否為a-f else if (tmp[i] <= 'f' && tmp[i] >= 'a'){ result += ((int) tmp[i] - 97 + 10)* power(16, dig); //+10是因為a表示10 dig--; }else if (tmp[i] <= 'F' && tmp[i] >= 'A'){ //為A到F result += ((int) tmp[i] - 65 + 10)* power(16, dig); dig--; } else{ printf("input error.\n"); return -2; } i++; } return result; } int main(int argc, char *argv[]) { char str[50] = {0}; int result = 0; printf("convert a hexadecimal number to a decimal one\n"); while (1) { printf("please input a hexadecimal number: (0x + number)\n" "exit with(exit)\n"); scanf("%s", str); if (strcmp(str, "exit") == 0){ break; } result = htoi(str); if (result >= 0) { printf("the decimal number is: %d\n", result); } } printf("\n"); return 0; }