字符串

字符数组

一种用来存储字符串信息的数组。

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;
}

小结

“值”和“变量”是两个概念,“变量”是存储“值”的地方。

  1. 字符串信息可以存储在字符数组中,字符数组就是“变量”的概念,字符串就是“值”的概念
  2. sscanf 和 sprintf 函数,本质上在做的是以字符串为中间值,做各种数据类型之间的转换。
posted @ 2020-03-28 11:29  insist钢  阅读(263)  评论(0编辑  收藏  举报