数字转化为字符串
面试例题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指向的第一个内存存放负号。