数字转化为字符串
面试例题1:使用库函数将数字转换为字符串。
考点:C库函数中数字转换为字符串的使用。
出现频率:★★★
解析
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。
itoa():将整型值转换为字符串。
ltoa():将长整型值转换为字符串。
ultoa():将无符号长整型值转换为字符串。
gcvt():将浮点型数转换为字符串,取四舍五入。
ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。
fcvt():指定位数为转换精度,其余同ecvt()。
还可以使用sprintf系列函数把数字转换成字符串,其比itoa()系列函数运行速度慢。下列程序演示了如何使用itoa()函数和gcvt()函数:
1 # include 2 # include 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_int12 gcvt(num_double, 8, str_double); //把浮点数num_double转成字符串str_double13 14 printf("str_int: %s/n", str_int);15 printf("str_double: %s/n", str_double);16 17 return 0;18 }
程序输出结果:
1 str_int: 4352 str_double: 435.10001
代码第11行中的参数10表示按十进制类型进行转换,转换后的结果是"435",如果按二进制类型进行转换,则结果为"1101110011"。
代码第12行中的参数8表示精确位数,这里得到的结果是"435.10001"。
答案
可以使用atoi系列函数把数字转换成字符串。
面试例题2:不使用库函数将整数转换为字符串。
考点:数字转换为字符串,理解相关ASCII码。
出现频率:★★★★
解析
如果不使用atoi或sprintf等库函数,可以通过把整数的各位上的数字加"0"转换成char类型并存到字符数组中。但是要注意,需要采用字符串逆序的方法。如以下程序所示:
1 #include 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的每一位上的数存入buf18 temp = temp / 10;19 }20 21 len = n < 0 ? ++i: i; //如果n是负数,则多需要一位来存储负号22 str[i] = 0; //末尾是结束符023 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: 1234Output: 1234
如果输入的是个负数,程序执行结果如下所示:
Please input an integer: -1234Output: -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指向的第一个内存存放负号。