#1037. [基础]数组III

[基础]数组III

字符串

字符串在 c++ 的 string 出现之前,c 风格的字符串数组是字符串存储的唯一形式。


c 风格字符串

char 数组是在 c 风格情况下的字符串存储方式,该形式必须要以 '\0' 空字符为结尾的要求。

简单来说,字符串可以是字符数组,但字符数组不一定是字符串。字符串是字符数组的一种特殊应用方式。而两者的关键性区别,就在于是否有一个合法的 '\0' 空字符作为字串的结尾。

'a' 与 "a" 是完全不同的两种数据

'a' 是一个 a 字符

"a" 是一个 a\0 两个字符的组合。


字符串是一种特殊的字符数组,字符数组又是数组,因此数组有的性质,字符数组有,字符串也有。包含定义方式,初始化方式和输入输出方式

例如:

char a[3] = {'0', 'a', '+'}; 是一个字符数组,但不是字符串

char a[4] = {'0', 'a', '+'}; 是一个字符数组,也是一个字符串,因为最后一个字符 a[3] 默认为 0,而空字符的 ascii 码正为 0

// 输出 ascii 码与字符对照
for (int i = 0; i <= 127; i ++) {
    printf("[%d]:[%c] ", i, i);
    if ((i + 1) % 4 == 0) cout << endl;
}

以上代码可以执行一次输出看看

因此,若是定义一个字符数组作为字符串使用,最好是以字符数组初始化为 0 的方式:char s[100] = {0}; 以确保至少一开始就没垃圾数据。


字符串输入

定义一个字符串数组:char s[100] = {0}; ( 以 100 个元素为例 )

不带空格字符串输入:cin >> s;scanf("%s", s);

一行字符串的输入 (不存最后 \n):cin.getline(s, 100);

一行字符串的输入 (存最后 \n): fgets(s, 100, stdin);


字符串输出

cout << s << endl;printf("%s\n", s);


字符串的相关工具 [仅列举最常用部分

字符串长度:int len = strlen(s);

字符串拷贝:strcpy(s1, s2); 将 s2 字符串拷贝进 s1

字符串比较:strcmp(s1, s2); 将 s1 与 s2 进行字典序比较

数组填充:memset(s, ch, n); 将数组 ssss 开始,以一字节数据 ch 填充 n 个字节。


c++ 风格字符串

c++ 风格的字符串 string 实际上是一个 STL 模板类,是一种比 c 风格字符串更复合型的一种存储结构。其本质是存储一串需要考察的字符,并在内部实现一系列字符串的应用工具。


在使用上,c++ 风格的字符串比 c 风格的字符串要方便不少,但需要注意,c ++ 风格的字符串,并不需要以空字符结尾,它会自己扩容,且以自身长度作为输出限制。


定义字符串string s; 此刻这仅仅是一个字符串容器,里面什么都没有,连存储空间都没,只是一个容器 (变量) 标记。


输入字符串

输入一段不带空格字符串:cin >> s;

输入一行字符串:getline(cin, s);


输出字符串

直接输出:cout << s << endl;

转换为 c 风格字符串输出:cout << s.c_str() << endl;puts(s.c_str());


字符串相关工具

仅介绍最常用且基础的

字符串长度:s.length() 或 s.size()

因此字符串遍历可以:

int len = s.size(); // 建议这样做,因为 s.size() 是一个无符号类型,与 int 比较可能存在风险
for (int i = 0; i < len; i ++) {
    cout << s[i] << endl; // 可以应用下标随机引用方式
}

c++ 风格字符串独有的运算

+: 拼接

<, >, ==: 字典序比较


以下哪个字符串比较大?

{{ select(1) }}

  • "234"
  • "34"