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

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

1、字符串转换成整型数

C语言库函数:atoi  实现了此功能。

int atoi(const char *nptr);

函数说明: 参数nptr字符串,如果 第一个非空格字符存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。
 
相同功能实现代码如下:
复制代码
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

/**
  *    功能:string转int
  *    注意:
  *    1、字符串是否为空;
  *    2、忽略\t 或空格;
  *    3、溢出判断;
  *    4、输入字符串只有“+”或“-”号时;
  *    5、扫描参数src字符串,跳过前面的空格字符,直到遇上数
     字或正负符号才开始做转换,而再遇到非数字或字符串结束时
     ('\0')才结束转换,并将结果返回。
  */
int convertionStringToInt(char *src)
{
    bool flag=false;
    long num=0;  /*使用long类型,数据溢出情形*/
    int minus=0;
    
    if((NULL == src)||('\0'== *src))  //判断如惨字符串指针是否为空
    {
        return 0;
    }
    if(('\t' == *src)||(' ' == *src)) //忽略tab字符和空格字符
    {
        src ++;
    }
    if('-' == *src)  //判断是否是‘+’ 或 ‘-’符号
    {
        flag=true;
        src++;
    }
    else if('+' == *src)
    {
        src++;
    }
    minus=flag?-1:1;
    
    while('\0' != *src)
    {
        if(('0' <= *src)&&('9' >= *src))
        {
            num= num*10+minus*((*src)-'0');
            if((!flag && num > 0x7FFFFFFF)
                 || (flag && num < (signed int)0x80000000))    //判断转换后的整型数是否溢出,注意正负数均要判断
             {
                 num = 0;
                 break;
             }
            src++;
        }
        else        
        {
            break; //遇到非数字字符时结束转换
        }
    }
    
    return num;
}


int main()
{
    char data[8][15]={"4673","15234234234","-3489","+9776","ab67","123bd","+","-"};
    int i=0;
    int val=0;
    
    for(i=0;i<8;i++)
    {
        printf("Before data[%ld]=%s       ",i,data[i]);
        val=convertionStringToInt(data[i]);
        printf("After Convert=%d\n",val);
    }

    return 0;
}
复制代码

实现结果截图如下,其中中间列为 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值