[知识点] 1.4.2 字符数组与 string

总目录 > 1  语言基础 > 1.4.2  字符数组与 string

前言

作为 C++ 的特性,string(字符串)在 OI 的几年里基本被没有用过,因为觉得 char 数组(字符数组)实在很方便。。这里单独开一篇以进一步了解下字符数组与字符串的各种联系、差异与优劣。

子目录列表

1、字符数组

2、string 类

 

1.4.2  字符数组与 string

1.4.2.1 字符数组

  ① 概念

    在 1.1 C 语言基础 与 1.2 C 语言进阶 中已经分别介绍了各种数据类型以及数组。在数组中,比较特殊的一类数组就是 char 类型的数组;

    其他数据类型的数组,尽管它们被归类于一个组,但其实元素之间依旧只存在一个逻辑地址上的关系,只是一串相邻的值;

    而 char 类型因为存储的是字符,如果将各个字符相连,正如将各个字母相连一样能够组成单词,就组成了一串字符,简称字符串

    我们用单引号来表示字符,而双引号表示字符串,如下两种对字符数组的定义均是合法的:

char a[] = {'h', 'e', 'l', 'l', 'o'};
char b[] = "hello";

    但它们并不等价,字符串整体赋值时会自动在字符串末尾加上 '\0' 字符,该字符为结束符,表示一个字符串的结束;

    也就是说,b 的实际内容为 "hello\0",而 a 为 "hello";

    注意到我们定义它们时没有给定长度,因为系统会自动给出,对于 a, b 其长度分别为 6, 5;

    当然我们也可以自定义,如果有效长度并未达到我们定义的长度,那么剩余的位置均会被系统自动添加上 "\0";

    我们一般只会关心字符数组的有效长度,利用上述特性,系统在输出字符数组时如果遇到 "\0" 就会判定该字符数组已经结束。

  ② 相关函数

    > strlen(s) 返回字符串 s 的长度;

    > strcpy(s1, s2) 将字符串 s2 赋值给 s1(说明不允许直接赋值);

    > strncpy(s1, s2, n) 将字符串 s2 的前 n 个字符赋值给 s1;

    > strcat(s1, s2) 将字符串 s2 连接到 s1 末尾;

    > strcmp(s1, s2) 比较字符串 s1 和 s2 的字典序

      关于字符串的字典序的比较,简单来说就是逐个字符比较是否相同,如果相同则比较下一位,否则:

        假设 s1, s2 的第 i 位字符不相同,比较两个字符的 ASCII 码大小,如果 s1[i] 更大,则 s1 > s2,函数值为正,否则为负。

      如果直到结束,所有字符均相同,则认为两个字符串等价,则函数值为 0。

      如果 s1 是 s2 的前缀,不难得出对于 s1 末尾的后一位 i,s1[i] = '\0',ASCII 码为 0,必然有 s1 < s2,即函数值为负。

    还有 strlwr, strupr, strchr, strstr... 其实除了第一条查询字符串长度函数外,其他函数都能比较轻松的手动实现,使用的也不多,了解即可;

    它们都包含于 <string.h>(对于 C++ 为 <cstring>)中。

  ③ 输入输出

    > scanf / printf

      > 逐个字符输入输出,使用 "%c";

      > 整个字符串一次性输入输出,使用 "%s"。

        不允许包含空格,空格是分隔不同字符串的标志;

        变量名前面不用加取地址符,因为数组名本身就代表了数组的起始地址。

    > gets / puts

      专门处理字符串的输入输出函数,gets 为输入,puts 为输出;

      puts 在使用时和 printf 基本等价,所以使用并不广泛;

      gets 相比 scanf 的优势在于允许空格的出现,即每次读取一整行的字符作为其字符串的值;

      gets 的特性在于,它读取数据时不会判断上限直到出现 "\n",系统不会自行判定溢出情况,在某些情况下这个特性是相当致命的,所以在一些编译器或者一些编程比赛中是禁止使用 gets 函数的;

      据此,gets 衍生出了许多替代品,比如 gets_s, fgets 等来通过增加上限参数等方式解决这一问题。

 

1.4.2.2 string 类

  stringC++ 标准库 <string> 中提供的一个,本质上是 std :: basic_string<char> 的简称,其作用就是实现字符串的功能。不同于 int, double, char 等,它们属于标准数据类型,C / C++ 通用,而 string 只是 C++ 标准库中的一个类,和其他 C++ 中的 STL 容器属于一种类型。

  因为字符数组的特殊性,C++ 直接原生提供字符串 string,某种程度上解决了很多不便。相比 char 数组,string 的优势在于:

    > 动态分配空间

    > 可以重载运算符

    > 可以整体赋值

  string 的实际操作更为便捷,由于可以直接赋值,所以不需要复制函数;连接字符串可以直接相加,比如 s = s1 + s2;求字符串 s 长度可以使用 s.size()

 

原文链接: https://www.cnblogs.com/jinkun113/p/13325451.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    [知识点] 1.4.2 字符数组与 string

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/366980

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午5:19
下一篇 2023年3月2日 下午5:20

相关推荐