字符串轉換整數及整數轉換字符串


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
  • 除法取整:
  1. 向上取整:向+∞方向取最接近精確值的整數。7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2
  2. 向下取整:向-∞方向取最接近精確值的整數。7/4=1,7/(-4)=-2,6/3=2,6/(-3)=-2
  3. 向零取整:向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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM