代码
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类型到字符串的转换。在main函数的第46行对int2str函数做了测试。程序的执行结果:
1 Please input an integer: 1234
2 Output: 1234
如果输入的是个负数,例如
1 Please input an integer: -1234
2 Output: -1234
接下来对int2str函数的实现进行分析。
代码第9 行,把传入参数n 的绝对值赋给temp,以后在计算各个位的整数时就用temp了,这样保证在负数情况下取余不会出现问题。
代码第11~14 行判断str 的有效性,str 应不为NULL。
代码第 15~19 行的 while 循环中,将 n 的各个位存放到局部数组 buf 中,存放的顺序与整数顺序相反。例如 n 为整数 123456,while 循环结束后 buf 应为"654321"。
代码第21 行计算实际转换后的字符串长度len,如果是负数,长度应该再加1。
代码第22~31行把数组buf中的非0元素逆向复制到参数str指向的内存中,如果n是负数,则保留str指向的第一个内存以存放负号'-'。
最后在第34 行里,如果是负数,添加负号'-'到str 开头。
补充
数字转字符串库函数
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。下面列举了各函数的方法及其说明。
itoa():将整型值转换为字符串。
ltoa():将长整型值转换为字符串。
ultoa():将无符号长整型值转换为字符串。
gcvt():将浮点型数转换为字符串,取四舍五入。
ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。
fcvt():以指定位数为转换精度,其余同ecvt()。
还可以使用sprintf系列函数把数字转换成字符串,这种方式的速度比itoa()系列函数的速度慢。
字符串数字库函数
C/C++提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)的数字。下面列举了各函数的方法及其说明。
atof():将字符串转换为双精度浮点型值。
atoi():将字符串转换为整型值。
atol():将字符串转换为长整型值。
strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。
strtol():将字符串转换为长整型值,并报告不能被转换的所有剩余数字。
strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。