數字字符串轉換成這個字符串對應的數字(十進制、十六進制)
(1)數字字符串轉換成這個字符串對應的數字(十進制)
要求:這個字符串參數必須包含一個或者多個數字,函數應該把這些數字轉換為整數並且返回這個整數。如果字符串參數包含任何非數字字符,函數就返回零。不必擔心算數溢出。
提示:你每發現一個數字,把當前值乘以10,並把這個值和新的數字所代表的值相加。
思路:字符指針減去’0’(對應ASCII值為48),即將其對應的ASCII碼值轉換為整型。第一次循環*str指向的是字符’1’,其對應的ASCII碼值為49,而’0’對應ASCII碼值為48,所以運用”*str-‘0’“目的是將字符’1’轉換成數字1,后面以此類推。
代碼如下:
#include <stdio.h> #include <assert.h>
int my_atoi(char *str) { int n = 0; int flag = 0; assert(str); if(*str == '-') { flag = 1; str++; } while(*str >= '0' && *str <= '9') { n = n*10 + (*str - '0'); str++; } if(flag == 1) { n = -n; } return n; } int main () { char a[] = "12"; char b[] = "-123"; printf("%d\n%d\n",my_atoi(a),my_atoi(b)); return 0; }
(2)數字字符串轉換成這個字符串對應的數字(十六進制)
要求:這個字符串參數必須包含一個或者多個數字,函數應該把這些數字轉換為整數並且返回這個整數。如果字符串參數包含任何非數字字符,函數就返回零。不必擔心算數溢出。
提示:你每發現一個數字,把當前值乘以16,並把這個值和新的數字所代表的值相加。
思路:字符指針減去’0’(對應ASCII值為48),即將其對應的ASCII碼值轉換為整型。第一次循環*str指向的是字符’1’,其對應的ASCII碼值為49,而’0’對應ASCII碼值為48,所以運用”*str-‘0’“目的是將字符’1’轉換成數字1,后面以此類推。
代碼如下:
#include <stdio.h> #include <assert.h> #include <iostream>
using namespace std; int change(char* str) { assert(str); int result = 0; int flag = 0; if (*str == '-') { flag = 1; str++; } while (*str) { if (*str >= '0' && *str <= '9') result = result * 16 + (*str - '0'); else if (*str >= 'a' && *str <= 'f') result = result * 16 + (*str - 'a' + 10); else if (*str >= 'A' && *str <= 'F') result = result * 16 + (*str - 'A' + 10); else { cout << "非法字符!" << endl; return 0; } str++; } if (flag == 1) result = -result; return result; } int main() { char str[] = "-16"; int res = change(str); cout << res << endl; return 0; }