任务 Q:printf 函数在输出浮点型数据的时候,如何保留位数呢?
1 2 printf ("%.2lf" , 3.1415926 );
A:%lf 是 double 双精度浮点型输出的格式占位符,当我们想要保留小数点后两位的时候,只需要在 % 和 lf 中间加上 .2 即可 ,2 写在 .(点) 的后面代表小数点后 2 位。
实现一个能够保留小数点后 n 位的程序,这里的 n 是我们程序读入的一个变量。 例如:
1 2 3 4 5 输入1:3.1415926 2 输出1:3.14 输入2:3.1415926 3 输出3:3.142
编码 思路 第一种:用switch case
语句做
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> int main () { double num; int n; scanf ("%lf%d" , &num, &n); switch (n) { case 1 : printf ("%.1lf\n" , num); break ; case 2 : printf ("%.2lf\n" , num); break ; case 3 : printf ("%.3lf\n" , num); break ; case 4 : printf ("%.4lf\n" , num); break ; case 5 : printf ("%.5lf\n" , num); break ; } return 0 ; }
那么如何优化呢???
第二种:printf 函数的第一个参数不就是个字符串,既然是字符串信息,那我只需要在 printf 语言前,拼接合适的字符串信息传给 printf 函数即可。
例如,要求保留 1 位小数的时候,我就拼接出来 “%.1lf” 字符串信息,要求保留 2 位小数的时候,就拼接处理出 “%.2lf”字符串信息即可。
实现 1 2 3 4 5 6 7 8 9 10 #include <stdio.h> int main () { double num; int n; char str[100 ]; scanf ("%lf%d" , &num, &n); sprintf (str, "%%.%dlf\n" , n); printf (str, num); return 0 ; }
思考题 1,体验利器
刚刚在上面,介绍了 sprintf 和 sscanf 两个字符串处理的利器工具,那么就请使用 sprintf 函数实现 strlen、strcpy、strcat 函数的功能,注意哦,只允许使用 sprintf 函数,模仿如上三个函数的功能。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> char str1[1000 ], str2[1000 ];int main () { scanf ("%s%s" , str1, str2); printf ("str1 = %s\tstr2 = %s\n" , str1, str2); sprintf (str1, "%s" , str1); sprintf (str1, "%s" , str2); printf ("str1 = %s\tstr2 = %s\n" , str1, str2); sprintf (str1, "%s%s" , str1, str2); printf ("str1 = %s\tstr2 = %s\n" , str1, str2); return 0 ; }
2,优美的遍历技巧
介绍完了字符串的相关知识以后,请思考如下问题,如何在不计算字符串长度的情况下,遍历字符串的每一位呢? 程序设计要求是,读入一个字符串,然后在不计算字符串长度的情况下,输出字符串中的每一个字符,每个字符占一行。其中所谓计算字符串长度的方法,包括但不限于 strlen,sprintf,先行 for 循环遍历统计等。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> int main () { char str[1000 ]; scanf ("%s" , str); for (int i = 0 ; str[i]; i++) { printf ("%c\n" , str[i]); } return 0 ; }
小结
具体结果就是值,明确知道等于多少的就是值。存储这些值的地方,就是变量,就是在程序中用来指代某片存储空间的名称,值就是存储空间里面的具体内容。
字符串信息可以存储在字符数组中,字符数组就是“变量”的概念,字符串就是“值”的概念。
sscanf 和 sprintf 函数,本质上在做的是以字符串为中间值,做各种数据类型之间的转换。