通过上一篇文章完成了十六进制字符串转成十进制整数,同理也很容易写出十进制字符串转成十进制整数的函数。考虑到十进制的字符串中可能会出现正负号,即转换后可能出现负整数,同样也增加了对这种情况的处理。例如将十进制的字符串"0621"、"+621"、"6210"、"-1234"转换十进制的整数,即621、621、6210、-1234。下面同样是正向和逆向两种方法的具体代码:
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 | /**
* 将十进制字符串转十进制数函数[从低位到高位单个字符转换]
* @author vfhky 2014.10.24 https://typecodes.com
* @param [in] HexStr 十进制字符串(例如"0621"、"+621"、"6210"、"-1234"等)
* @return -1:字符串为空; -2:字符串中包含非十进制的字符; 其它:对应的十进制整数
*/
int IntegerStr2Integer1( char * HexStr )
{
int iResult, iCycle, iHexStrLen;
iResult = 0;
iCycle = 1;
iHexStrLen = 0;
//正负数的标识,1正 -1负
int iFlag = 1;
//初始化指针变量p(指向十进制字符串的首地址)
char * p = HexStr;
//获取十进制字符串的长度
while( *p != 0x00 )
p++;
iHexStrLen = p - HexStr;
//判断字符串是否合法
if( iHexStrLen == 0 || ( *HexStr == '+' && iHexStrLen == 1 ) || ( *HexStr == '-' && iHexStrLen == 1 ) )
return -1;
//长度去掉正负号,并设置字符数的标识
if( ( *HexStr == '+' ) || ( *HexStr == '-' ) )
{
--iHexStrLen;
p = HexStr + 1;
if( *HexStr == '-' )
iFlag = -1;
}
else p = HexStr;
//循环将每个十进制的字符转换成对应的十进制整数
while( iCycle <= iHexStrLen )
{
if( ( *p >= 48 ) && ( *p <= 57 ) )
*p -= 48;
else
return -2;
iResult = *p + iResult*10;
++iCycle;
++p;
}
//返回转换后的整数
return iFlag*iResult;
}
|
如下图所示,用GCC编译(gcc integerstrtointeger.c -o integerstrtointeger
)测试程序并执行,结果将三个测试用的十进制的字符串"0621"、"+621"、"6210"、"-1234"分别转换成了对应的十进制整数:621、621、6210、-1234。用下面第二种方法结果也是一样的。
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 | /**
* 将十进制字符串转十进制数函数[从高位到低位单个字符转换]
* @author vfhky 2014.10.24 https://typecodes.com
* @param [in] HexStr 十进制字符串(例如"0621"、"+621"、"6210"、"-1234"等)
* @return -1:字符串为空; -2:字符串中包含非十进制的字符; 其它:对应的十进制整数
*/
int IntegerStr2Integer2( char * HexStr )
{
int iResult, iCycle, iHexStrLen;
iResult = 0;
iCycle = 1;
iHexStrLen = 0;
//正负数的标识,1正 -1负
int iFlag = 1;
//初始化指针变量p(指向十进制字符串的首地址)
char * p = HexStr;
//获取十进制字符串的长度
while( *p != 0x00 )
p++;
iHexStrLen = p - HexStr;
//判断字符串是否合法
if( iHexStrLen == 0 || ( *HexStr == '+' && iHexStrLen == 1 ) || ( *HexStr == '-' && iHexStrLen == 1 ) )
return -1;
//长度去掉正负号,并设置字符数的标识
if( ( *HexStr == '+' ) || ( *HexStr == '-' ) )
{
--iHexStrLen;
if( *HexStr == '-' )
iFlag = -1;
}
//循环将每个十进制的字符转换成对应的十进制整数
while( iHexStrLen > 0 )
{
if( ( *(--p) >= 48 ) && ( *p <= 57 ) )
*p -= 48;
else
return -2;
iResult += *p*iCycle;
iCycle *= 10;
--iHexStrLen;
}
//返回转换后的整数
return iFlag*iResult;
}
|
不过,C/C++的lib库中已经提供了将字符串转换成短整型、浮点型的函数(声明在stdlib.h头文件中),即ASCII to integer(atoi)、ASCII to float(atof)。测试如下:
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 | /**
* C/C++的lib库中atoi、atof字符串转换短整型、浮点型的测试
* @author vfhky 2014.10.24 https://typecodes.com
*/
#include "stdio.h"
#include "stdlib.h"
int main()
{
char a[] = "1234";
char b[] = "1234.56";
char c[] = "-1234";
char d[] = "0621";
int i, j;
float k;
//atoi函数转换成整数(正): a=[1234], i=[1234]
i = atoi( a );
printf( "a=[%s], i=[%d]\n\n", a, i );
//atoi函数转换成整数(负): c=[-1234], j=[-1234]
j = atoi( c );
printf( "c=[%s], j=[%d]\n\n", c, j );
//atof函数转换成浮点型: b=[1234.56], k=[1234.560059]
k = atof( b );
printf( "b=[%s], k=[%f]\n\n", b, k );
//atoi函数转换成整数(正): b=[1234.56], i=[1234]
i = atoi( b );
printf( "b=[%s], i=[%d]\n\n", b, i );
//atoi函数转换成整数(正): d=[0621], i=[621]
i = atoi( d );
printf( "d=[%s], i=[%d]\n\n", d, i );
return 0;
}
|
Comments »