整理atoi itoa的实现
一、atoi
原型:
int atoi(const char *nptr);
参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零,
1 #include<stdlib.h>
2 #include<stdio.h>
3 int main(void)
4 {
5 #if 0
6 float n;
7 char*str="12345.67cd";//12345.000000
8 // char*str="-12345.67cd";//-12345.000000
9 // char*str="ab12345.67cd";//0.000000
10 n=atoi(str);
11 printf("string=%s\ninteger=%f\n",str,n);
12 #else
13
14 char a[]="-110";
15 char b[]="123";
16 int c;
17 c = atoi(a) + atoi(b);
18 printf("c=%d\n",c);//13
19 #endif
20 return 0;
21 }
2、itoa
char *itoa( int value, char *string,int radix);
原型说明:
value:欲转换的数据。
string:目标字符串的地址。
radix:转换后的进制数,可以是10进制、16进制等。
程序实例:
#include <stdlib.h>
#include <stdio.h>
int
main(
void
)
{
int
number = 12345;
char
string[32];
itoa(number, string, 10);
printf
(
"integer = %d string = %s\n"
, number, string);
return
0;
}
itoa 并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。
标准库中有sprintf,功能比这个更强,用法跟printf类似:
char str[255];
sprintf(str, "%x", 100); //将100转为16进制表示的字符串。
摘抄itoa实现:
1、
void itoa(int n,char s[])
{
int i,j,k,sign;
char tmp;
if((sign=n)<0)
n=-n;
i=0;
do{
s[i++]=n%10+'0';
}
while ((n/=10)>0);
if(sign<0)
s[i++]='-';
s[i]='\0';
//printf("debug int n: %d\n",n);
//printf("debug char s: %s\n",s);
/*
for debug input int i and output char s[];
*/
for(j=i-1,k=0;j>((i-1)/2);j--,k++)
{
tmp=s[k];
s[k]=s[j];
s[j]=tmp;
}
//printf("debug str: %s\n",s);
}
{
int i,j,k,sign;
char tmp;
if((sign=n)<0)
n=-n;
i=0;
do{
s[i++]=n%10+'0';
}
while ((n/=10)>0);
if(sign<0)
s[i++]='-';
s[i]='\0';
//printf("debug int n: %d\n",n);
//printf("debug char s: %s\n",s);
/*
for debug input int i and output char s[];
*/
for(j=i-1,k=0;j>((i-1)/2);j--,k++)
{
tmp=s[k];
s[k]=s[j];
s[j]=tmp;
}
//printf("debug str: %s\n",s);
}
2、
转一个高效方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
char *myitoa( int value, char *str, int radix ) { static char szMap[] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' }; // 字符映射表 int nCount = -1, nIndex; char *pStr = str, nTemp; if ( radix >= 2 && radix <= 36 ) { // 限制radix必须在2到36之间 if ( value < 0 && radix == 10 ) { // 如果是负数就在首位添加负号,并将字符串前移 *pStr++ = '-' ; value = -value; //转为正数, } unsigned int nValue = *(unsigned*)&value; do { // 循环转换每一个数字,直到结束 pStr[ ++nCount ] = szMap[ nValue % radix ]; nValue /= radix; } while ( nValue > 0 ); // 转换结束后字符串是翻的 nIndex = ( nCount + 1 ) / 2; // 计算出一半的长度 while ( nIndex-- > 0 ) { // 将字符串的字符序翻转 nTemp = pStr[ nIndex ]; pStr[ nIndex ] = pStr[ nCount - nIndex ]; pStr[ nCount - nIndex ] = nTemp; } } pStr[ nCount + 1 ] = '\0' ; // 置结束符 return str; } |
3、转一个看看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
/*** *atox.c - atoi and atol conversion * * Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved. * *Purpose: * Converts a character string into an int or long. * *******************************************************************************/ #include <cruntime.h> #include <stdlib.h> #include <ctype.h> /*** *long atol(char *nptr) - Convert string to long * *Purpose: * Converts ASCII string pointed to by nptr to binary. * Overflow is not detected. * *Entry: * nptr = ptr to string to convert * *Exit: * return long int value of the string * *Exceptions: * None - overflow is not detected. * *******************************************************************************/ long __cdecl atol ( const char *nptr ) { int c; /* current char */ long total; /* current total */ int sign; /* if ''-'', then negative, otherwise positive */ /* skip whitespace */ while ( isspace (( int )(unsigned char )*nptr) ) ++nptr; c = ( int )(unsigned char )*nptr++; sign = c; /* save sign indication */ if (c == '' - '' || c == '' + '' ) c = ( int )(unsigned char )*nptr++; /* skip sign */ total = 0; while ( isdigit (c)) { total = 10 * total + (c - '' 0 '' ); /* accumulate digit */ c = ( int )(unsigned char )*nptr++; /* get next char */ } if (sign == '' - '' ) return -total; else return total; /* return result, negated if necessary */ } /*** *int atoi(char *nptr) - Convert string to long * *Purpose: * Converts ASCII string pointed to by nptr to binary. * Overflow is not detected. Because of this, we can just use * atol(). * *Entry: * nptr = ptr to string to convert * *Exit: * return int value of the string * *Exceptions: * None - overflow is not detected. * *******************************************************************************/ int __cdecl atoi ( const char *nptr ) { return ( int ) atol (nptr); } #ifndef _NO_INT64 __int64 __cdecl _atoi64( const char *nptr ) { int c; /* current char */ __int64 total; /* current total */ int sign; /* if ''-'', then negative, otherwise positive */ /* skip whitespace */ while ( isspace (( int )(unsigned char )*nptr) ) ++nptr; c = ( int )(unsigned char )*nptr++; sign = c; /* save sign indication */ if (c == '' - '' || c == '' + '' ) c = ( int )(unsigned char )*nptr++; /* skip sign */ total = 0; while ( isdigit (c)) { total = 10 * total + (c - '' 0 '' ); /* accumulate digit */ c = ( int )(unsigned char )*nptr++; /* get next char */ } if (sign == '' - '' ) return -total; else return total; /* return result, negated if necessary */ } #endif /* _NO_INT64 */ #include <msvcrt/errno.h> #include <msvcrt/stdlib.h> #include <msvcrt/internal/file.h> char * _itoa( int value, char * string, int radix) { char tmp[33]; char * tp = tmp; int i; unsigned v; int sign; char * sp; if (radix > 36 || radix <= 1) { __set_errno(EDOM); return 0; } sign = (radix == 10 && value < 0); if (sign) v = -value; else v = (unsigned)value; while (v || tp == tmp) { i = v % radix; v = v / radix; if (i < 10) *tp++ = i+ '' 0 '' ; else *tp++ = i + '' a '' - 10; } if (string == 0) string = ( char *) malloc ((tp-tmp)+sign+1); sp = string; if (sign) *sp++ = '' - '' ; while (tp > tmp) *sp++ = *--tp; *sp = 0; return string; } |
4、
1 //n是要被转换的十进制数,bit是要被转换的进制数
2 #include <iostream>
3 #include <string>
4 using namespace std;
5
6 char * Ten_to_other(int num,char* str, int radix)
7 {
8 const char a[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
9 char *ptr=str;
10 bool negtive = false;
11 if(num==0)
12 {
13 *ptr++=0;
14 *ptr='\0';
15 return NULL;//直接就退出,不走后面的情况了,不跟后面共用一个return语句。
16 }
17 if(num<0)
18 {
19 num *= -1;
20 *ptr++ ='-';
21 negtive = true;
22 }
23 while(num) //不能处理num=0的情况
24 {
25 *ptr++=a[num%radix];
26 num /= radix;
27 }
28 *ptr='\0';//此时ptr已经指向字符串结尾,而str仍旧指向字符串开始。
29 ptr--;//让ptr指向字符串内容!!
30 char *start=(negtive)? str+1:str;//注意此处不能写str++,否则,str不指向保存值的首地址了
31 while(start<ptr)
32 {
33 char tmp=*ptr;
34 *ptr=*start;
35 *start=tmp;
36 ptr--;
37 start++;
38 /*char tmp=*ptr--;//这样写ptr,str都加了那么多遍,肯定错了啊!!!
39 *ptr--=*str++;
40 *str++=tmp;*/
41 }
42 /*int len=strlen(str);
43 int i = (negtive)? 1:0;
44 for(i; i<len/2; ++i) //当为负数时候,str字符串最后的字符不能用len-1-i了,因为此时i=1而不是0
45 {
46 char tmp = str[i];
47 str[i]=str[len-1-i];
48 str[len-1-i]=tmp;
49 } */
50 return NULL;
51 }
52 int main()
53 {
54 char a[12]={0};
55 Ten_to_other(-82,a,6);
56 cout<<a<<endl;
57 system("pause");
58 return 0;
59 }
2 #include <iostream>
3 #include <string>
4 using namespace std;
5
6 char * Ten_to_other(int num,char* str, int radix)
7 {
8 const char a[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
9 char *ptr=str;
10 bool negtive = false;
11 if(num==0)
12 {
13 *ptr++=0;
14 *ptr='\0';
15 return NULL;//直接就退出,不走后面的情况了,不跟后面共用一个return语句。
16 }
17 if(num<0)
18 {
19 num *= -1;
20 *ptr++ ='-';
21 negtive = true;
22 }
23 while(num) //不能处理num=0的情况
24 {
25 *ptr++=a[num%radix];
26 num /= radix;
27 }
28 *ptr='\0';//此时ptr已经指向字符串结尾,而str仍旧指向字符串开始。
29 ptr--;//让ptr指向字符串内容!!
30 char *start=(negtive)? str+1:str;//注意此处不能写str++,否则,str不指向保存值的首地址了
31 while(start<ptr)
32 {
33 char tmp=*ptr;
34 *ptr=*start;
35 *start=tmp;
36 ptr--;
37 start++;
38 /*char tmp=*ptr--;//这样写ptr,str都加了那么多遍,肯定错了啊!!!
39 *ptr--=*str++;
40 *str++=tmp;*/
41 }
42 /*int len=strlen(str);
43 int i = (negtive)? 1:0;
44 for(i; i<len/2; ++i) //当为负数时候,str字符串最后的字符不能用len-1-i了,因为此时i=1而不是0
45 {
46 char tmp = str[i];
47 str[i]=str[len-1-i];
48 str[len-1-i]=tmp;
49 } */
50 return NULL;
51 }
52 int main()
53 {
54 char a[12]={0};
55 Ten_to_other(-82,a,6);
56 cout<<a<<endl;
57 system("pause");
58 return 0;
59 }