每日一面—— 不使用库函数将整数转换为字符串

 代码

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():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值