klusday

(转载)将数值转化为字符串的函数

0
阅读(2576)
数字转化为字符串

面试例题1:使用库函数将数字转换为字符串。

考点:C库函数中数字转换为字符串的使用。

出现频率:★★★

解析

C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。

itoa():将整型值转换为字符串。

ltoa():将长整型值转换为字符串。

ultoa():将无符号长整型值转换为字符串。

gcvt():将浮点型数转换为字符串,取四舍五入。

ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。

fcvt():指定位数为转换精度,其余同ecvt()。

还可以使用sprintf系列函数把数字转换成字符串,其比itoa()系列函数运行速度慢。下列程序演示了如何使用itoa()函数和gcvt()函数:

1    # include <stdio.h>
2    # include <stdlib.h>
3    
4    int main ()
5    {
6        int num_int = 435;
7        double num_double = 435.10f;
8        char str_int[30];
9        char str_double[30];
10   
11       itoa(num_int, str_int, 10);  //把整数num_int转成字符串str_int
12       gcvt(num_double, 8, str_double);  //把浮
点数num_double转成字符串str_double
13   
14       printf("str_int: %s/n", str_int);
15       printf("str_double: %s/n", str_double);
16   
17       return 0;
18   } 
程序输出结果:
1    str_int: 435
2    str_double: 435.10001

代码第11行中的参数10表示按十进制类型进行转换,转换后的结果是"435",如果按二进制类型进行转换,则结果为"1101110011"。

代码第12行中的参数8表示精确位数,这里得到的结果是"435.10001"。

答案

可以使用atoi系列函数把数字转换成字符串。

面试例题2:不使用库函数将整数转换为字符串。

考点:数字转换为字符串,理解相关ASCII码。

出现频率:★★★★

解析

如果不使用atoi或sprintf等库函数,可以通过把整数的各位上的数字加"0"转换成char类型并存到字符数组中。但是要注意,需要采用字符串逆序的方法。如以下程序所示:

1    #include <iostream>
2    using namespace std;
3    
4    void int2str(int n, char *str)
5    {
6        char buf[10] = "";
7        int i = 0;
8        int len = 0;
9        int temp = n < 0 ? -n: n;  // temp为n的绝对值
10   
11       if (str == NULL)
12       {
13           return;
14       }
15       while(temp)
16       {
17           buf[i++] = (temp % 10) + '0';  //把temp的每一位上的数存入buf
18           temp = temp / 10;
19       }
20   
21       len = n < 0 ? ++i: i;  //如果n是负数,则多需要一位来存储负号
22       str[i] = 0;            //末尾是结束符0
23       while(1)
24       {
25           i--;
26           if (buf[len-i-1] ==0)
27           {
28               break;
29           }
30           str[i] = buf[len-i-1];  //把buf数组里的字符拷到字符串
31       }
32       if (i == 0 ) 
33       {
34           str[i] = '-';          //如果是负数,添加一个负号
35       }
36   }
37   
38   int main()
39   {
40       int nNum;
41       char p[10];
42   
43       cout << "Please input an integer:";
44       cin >> nNum;
45       cout << "output: " ;
46       int2str(nNum, p);        //整型转换成字符串
47       cout<< p << endl;
48   
49       return 0;
50   }
程序中的int2str函数完成了int类型到字符串类型的转换。在代码第46行对int2str函数做了测试。程序的执行结果如下所示:
Please input an integer: 1234
Output: 1234 
如果输入的是个负数,程序执行结果如下所示:
Please input an integer: -1234
Output: -1234 

接下来对int2str函数的实现进行分析。

代码第9行,把参数n的绝对值赋给temp,以后在计算各个位的整数时用temp,这样保证在负数情况下取余不会出现问题。

代码第11~第14行判断str的有效性,str不为NULL。

代码第15~第19行的while循环中,将n的各个位存放到局部数组buf中,存放的顺序与整数顺序相反。例如n为整数123 456,while循环结束后buf应为"654 321"。

代码第21行计算转换后字符串的长度len,如果是负数,长度应该再加1。

代码第22~第31行把数组buf中的非0元素逆向复制到参数str指向的内存中,如果n是负数,则str指向的第一个内存存放负号。