字符串转换整数及整数转换字符串
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
当你心中只有一个目标时,全世界都会给你让路!Read more! Write more! Practise more!
新浪微博:liu_军