不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

字符串_printf 的高级用法

任务

Q:printf 函数在输出浮点型数据的时候,如何保留位数呢?

1
2
printf("%.2lf", 3.1415926);
//输出:3.14

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; //定义一个浮点型变量 num
int n; //定义一个整型变量 n
char str[100]; //定义一个字符数组 str
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); // strlen(str1),输出str1 字符串中的字符数量
//printf("strlen= %s\n",str1);
sprintf(str1, "%s", str2); // strcpy(str1, str2),把 str2 的内容复制到了 str1 中
printf("str1 = %s\tstr2 = %s\n", str1, str2);
sprintf(str1, "%s%s", str1, str2); // strcat(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);
/*
循环的结束条件:
任何信息在底层都是二进制存储的,那么其余字符均为非零值,也就是代表条件成立。
只有一个字符的值是零值,就是我们之前所说的字符串中的最后一个特殊的,看不见的字符,\0 字符,
这个字符所对应的整型值就是 0,也就是我们所谓的假值。那么这个循环,就会一直循环到字符串的最后一位,才会停止。
*/
for (int i = 0; str[i]; i++) {
printf("%c\n", str[i]);
}
return 0;
}

小结

  • 具体结果就是值,明确知道等于多少的就是值。存储这些值的地方,就是变量,就是在程序中用来指代某片存储空间的名称,值就是存储空间里面的具体内容。
  • 字符串信息可以存储在字符数组中,字符数组就是“变量”的概念,字符串就是“值”的概念。
  • sscanf 和 sprintf 函数,本质上在做的是以字符串为中间值,做各种数据类型之间的转换。
------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!