1、字符串轉換成整型數
C語言庫函數:atoi 實現了此功能。
int atoi(const char *nptr);
函數說明: 參數nptr字符串,如果
第一個非空格字符存在或者不是數字也不是正負號則返回零,否則開始做類型轉換,之后檢測到非數字(包括結束符 \0) 字符時停止轉換,返回整型數。
相同功能實現代碼如下:
1 /** 2 * 功能:str轉int 3 * 注意: 4 * 1、字符串是否為空; 5 * 2、非法輸入如何處理; 6 * 3、溢出判斷; 7 * 4、輸入字符串只有“+”或“-”號時; 8 * 5、如何轉換:從字符串中輸入一個個字符進行處理 9 */ 10 11 #include <stdio.h> 12 #include <stdlib.h> 13 #include <assert.h> 14 #include <string.h> 15 16 enum Status{ kValid = 0, kInValid }; //全局變量,標志字符串輸入的狀態:有效和無效 17 int g_nStatus = kInValid; 18 long long ConvertStrtoInt(const char *digit, bool minus); 19 20 int StrtoInt(const char *str) 21 { 22 bool minus = false; //標識字符串是否有“+”或“-”號 23 long long num = 0; 24 if(str != NULL && *str != '\0') 25 { 26 if(*str == '+') 27 str++; 28 else if(*str == '-') 29 { 30 minus = true; 31 str++; 32 } 33 if(*str != '\0') //字符串為非空字符時 34 { 35 num = ConvertStrtoInt(str,minus); 36 } 37 } 38 return (int)num; 39 } 40 41 long long ConvertStrtoInt(const char *digit, bool minus) 42 { 43 long long num = 0; 44 while(*digit != '\0') 45 { 46 int flag = minus ? -1:1; 47 if(*digit >= '0' && *digit <= '9') //輸入的字符應為數字,此時為有效輸入 48 { 49 num = num*10 + flag*(*digit - '0'); //字符串轉換為整型數,注意正負數區別;此處須減去'0',否則按阿拉伯數字字符的ASCII碼表示。 50 if((!minus && num > 0x7FFFFFFF) 51 || (minus && num < (signed int)0x80000000)) //判斷轉換后的整型數是否溢出,注意正負數均要判斷 52 { 53 num = 0; 54 break; 55 } 56 digit++; 57 } 58 else 59 { 60 num = 0; //輸入的字符為非法字符時,為無效輸入 61 break; 62 } 63 } 64 if(*digit == '\0') 65 { 66 g_nStatus = kValid; //當輸入字符串的最后一個字符為NULL時,此時輸入為有效,其余的情況均為無效 67 } 68 return num; 69 } 70 71 int main(int argc, char **argv) 72 { 73 char *str[] = {"20130220","-12345678","+98765432","+987654321","abcdefg","+"}; 74 char **pStr = str; 75 int my_num = 0; 76 int num = 0; 77 for(int i = 0; i < 6; i++) 78 { 79 assert(pStr != NULL); 80 printf("str[%d] = %s\t", i, *pStr); 81 num = atoi(*pStr); 82 printf("num[%d] = %d\t", i, num); 83 my_num = StrtoInt(*pStr++); 84 printf("my_num[%d] = %d\n",i, my_num); 85 } 86 system("pause"); 87 return 0; 88 }
實現結果截圖如下,其中中間列為 atoi 函數實現結果:
2、整型數轉字符串
常見實現函數為itoa,itoa是廣泛應用的非標准C語言擴展函數。由於它不是標准C語言函數,所以不能在所有的編譯器中使用。但是,大多數的編譯器(如Windows上的)通常在<stdlib.h>頭文件中包含這個函數。在<stdlib.h>中與之有相反功能的函數是atoi。
char *itoa(int value, char *string, int radix);
int value 被轉換的整數,char *string 轉換后儲存的字符
數組,int radix 轉換進制數,如2,8,10,16 進制等。
一點點預備知識:
- 取模運算:A%B = A - (A/B)*B
- 除法取整:
- 向上取整:向+∞方向取最接近精確值的整數。7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2
- 向下取整:向-∞方向取最接近精確值的整數。7/4=1,7/(-4)=-2,6/3=2,6/(-3)=-2
- 向零取整:向0方向取最接近精確值的整數。7/4=1,7/(-4)=-1,6/3=2,6/(-3)=-2, C/C++、Java采用此種取整方式,因為(-a)/b = -(a/b)方便程序設計。
因此,C/C++: 7%(-3)=1, Java: 7%(-3)=1, Python2.6: 7%(-3) = 7-(7/-3)*(-3) = -2(主要由於Python中除法采用向下取整)
整型數轉字符串實現代碼如下:
1 /** 2 * 功能:整數轉字符串 3 * 注意: 4 * 1、十進制負數轉十進制 5 * 2、十進制負數如何轉其他進制 6 * 3、轉換后逆序保存 7 */ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 12 /** 13 * 功能:整數轉字符串 14 * @param int var 輸入的整數 15 * @param int radix 轉換進制 16 * @return char * 返回轉換后的字符串地址 17 */ 18 char *my_iota(int var, int radix) 19 { 20 static char local[33] = {0}; //考慮了32位二進制 21 char *p = &local[32]; 22 static unsigned char table[] = "0123456789abcdef"; 23 24 bool sign = false; 25 unsigned int tmp; 26 if(radix < 2 && radix > 16) 27 { 28 *p = '\0'; 29 return p; 30 } 31 if(var < 0 && radix == 10) //負整數轉換十進制時,特殊處理 32 { 33 sign = true; 34 var = -var; 35 } 36 tmp = var; //強制轉化為無符號數,如var = -125 = 11111111 11111111 11111111 10000011, 37 //tmp = 11111111 11111111 11111111 10000011,此時首位1的含義已不同。 38 39 *p-- = '\0'; 40 do{ 41 *p-- = table[tmp % radix]; 42 tmp /= radix; 43 }while(tmp > 0); //進制轉換 44 45 if(sign == true) //負整數轉換為十進制 46 { 47 *p-- = '-'; 48 } 49 return p+1; 50 } 51 52 int main(int argc, char **argv) 53 { 54 char result[33]; 55 int pos_num = 126; 56 int neg_num = -126; 57 int radix = 0; 58 59 printf("my_iota:\n"); 60 61 radix = 2; 62 printf("pos_num: %d, radix: %d\t result: %s\n",pos_num,radix,my_iota(pos_num,radix)); 63 printf("neg_num: %d, radix: %d\t result: %s\n",neg_num,radix,my_iota(neg_num,radix)); 64 65 radix = 8; 66 printf("pos_num: %d, radix: %d\t result: %s\n",pos_num,radix,my_iota(pos_num,radix)); 67 printf("neg_num: %d, radix: %d\t result: %s\n",neg_num,radix,my_iota(neg_num,radix)); 68 69 radix = 10; 70 printf("pos_num: %d, radix: %d\t result: %s\n",pos_num,radix,my_iota(pos_num,radix)); 71 printf("neg_num: %d, radix: %d\t result: %s\n",neg_num,radix,my_iota(neg_num,radix)); 72 73 radix = 16; 74 printf("pos_num: %d, radix: %d\t result: %s\n",pos_num,radix,my_iota(pos_num,radix)); 75 printf("neg_num: %d, radix: %d\t result: %s\n",neg_num,radix,my_iota(neg_num,radix)); 76 77 printf("itoa:\n"); 78 radix = 2; 79 printf("pos_num: %d, radix: %d\t result: %s\n",pos_num,radix,itoa(pos_num,result,radix)); 80 printf("neg_num: %d, radix: %d\t result: %s\n",neg_num,radix,itoa(neg_num,result,radix)); 81 82 radix = 8; 83 printf("pos_num: %d, radix: %d\t result: %s\n",pos_num,radix,itoa(pos_num,result,radix)); 84 printf("neg_num: %d, radix: %d\t result: %s\n",neg_num,radix,itoa(neg_num,result,radix)); 85 86 radix = 10; 87 printf("pos_num: %d, radix: %d\t result: %s\n",pos_num,radix,itoa(pos_num,result,radix)); 88 printf("neg_num: %d, radix: %d\t result: %s\n",neg_num,radix,itoa(neg_num,result,radix)); 89 90 radix = 16; 91 printf("pos_num: %d, radix: %d\t result: %s\n",pos_num,radix,itoa(pos_num,result,radix)); 92 printf("neg_num: %d, radix: %d\t result: %s\n",neg_num,radix,itoa(neg_num,result,radix)); 93 94 system("pause"); 95 return 0; 96 }
實現結果截圖如下:
參考:
[1] 何海濤 《劍指offer》
[2] http://blog.csdn.net/subfate/article/details/7975763
[3] http://www.jb.man.ac.uk/~slowe/cpp/itoa.html