TypeCodes

C语言将十进制字符串转成十进制整数

通过上一篇文章完成了十六进制字符串转成十进制整数,同理也很容易写出十进制字符串转成十进制整数的函数。考虑到十进制的字符串中可能会出现正负号,即转换后可能出现负整数,同样也增加了对这种情况的处理。例如将十进制的字符串"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;   
}

C/C++的lib库中atoi、atof字符串转换短整型、浮点型的测试

打赏支持

Comments »