分享

字符串转换整数及整数转换字符串

 520jefferson 2015-04-27

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./~slowe/cpp/itoa.html

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多