字符串
字符数组
一种用来存储字符串信息的数组。
printf("%.2lf", 3.1415926);
%lf 是 double 双精度浮点型输出的格式占位符,当我们想要保留小数点后两位的时候,只需要在 % 和 lf 中间加上 .2 即可,2 写在 .(点) 的后面代表小数点后 2 位。
1. 值和变量
整型变量,就是存储整型的变量。
整型变量存储整型值,浮点型变量存储浮点型值。
2. 字符串和字符数组
“字符串”就是“值”,而“字符数组”就是存储字符串数据的空间,类比于“变量”的概念。
字符串长度,就是字符串内容所占字节数量,例如示意图中“hello world”这个字符串内容,长度是 11。
字符串占用空间,要比“字符串长度”多 1,多出来的这个 1,就是用来存放 \0 字符的。
3. 字符串操作的利器
整型数据支持的操作都有什么:加、减、乘、除和取余运算。
求字符串长度的 strlen 函数,拷贝字符串的 strcpy 函数,比较字符串的 strcmp 函数,连接两个字符串的 strcat 函数。
字符串操作函数sscanf 函数和 sprintf 函数
char str[20] = "123.45";
double num;
sscanf(str, "%lf", &num);
sscanf 从 str 所存储的字符串中读入一个浮点型数据,然后赋值给 num 变量,这里比传统的 scanf 函数多了一个参数,这个参数代表读取数据的字符串信息。
sscanf 就是提供了一种将字符串信息转换成其他信息的方式。
char str[100];
sprintf(str, "hello world");
printf("%s", str);
将 “hello world” 字符串,输出到了 str 字符数组中,也就是完成了一个字符数组赋值的过程。
sprintf 函数就是将原本 printf 函数输出的内容,输出到一个字符数组中存储起来,以方便在程序中的后续操作和使用。
sscanf 函数与 sprintf 函数对比着看的话,如果说 sscanf 是将字符串转换成整型、浮点型等其他类型的方法,那么 sprintf 就是将其他类型转换成字符串类型的方法。
#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;
}
变量代表了问题中可以被抽象化出来的量,就像以前,我们刻板的认为 printf 的第一个参数只能是一个显示的字符串信息。
思考题(1):体验利器
刚刚在上面,介绍了 sprintf 和 sscanf 两个字符串处理的利器工具,那么就请使用 sprintf 函数实现 strlen、strcpy、strcat 函数的功能,注意哦,只允许使用 sprintf 函数,模仿如上三个函数的功能。
#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)
sprintf(str1, "%s", str2); // strcpy(str1, str2)
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 循环遍历统计等。
#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 函数,本质上在做的是以字符串为中间值,做各种数据类型之间的转换。