跳转至

字符数组(先不看)

先把 string 用熟,再看字符数组。下面都从下标 0 开始。

用字符数组表示字符串

char s[110] = "zq";

也可以这样初始化,剩余元素自动补 0:

char s[110] = {'z', 'q'};

这两种写法,开头的存储内容都是:

s[0] = 'z'
s[1] = 'q'
s[2] = '\0'

C 风格字符串,以 '\0' 结尾。 它的编码值是 0,表示字符串到这里结束。

"zq" 长度是 2,但存放它至少要 3 个字符位置,末尾的 '\0' 也占空间。

字符数组的输入输出

使用 cin、cout

char s[110];
cin >> s; // 本例保证输入不超过109个非空白字符

cout << s;

使用 scanf、printf

需要头文件 <cstdio>。

char s[110];
scanf("%109s", s); // 最多读109个字符,给结尾留一个位置

printf("%s", s);

读字符串时,数组名 s 前面不加 &。成功读入后,会自动补上 '\0'。

这两种输入,都不能直接读入含空格的整行内容。

字符数组的长度与遍历

使用 strlen,需要头文件 <cstring>。

int len = (int)strlen(s);
for (int i = 0; i < len; i++) cout << s[i];

strlen 数到第一个 '\0' 为止,不把结束符算进长度。

末尾没有 '\0',就不能当 C 风格字符串使用。 手动逐个填字符时,要自己补上结束符。

二维字符数组

每一行存一个字符串,可以表示棋盘、地图,也可以存一组单词。

char s[110][110];

第二维的容量,要给 '\0' 留位置。 每行最多存 109 个普通字符,再加结束符。

输入输出

下面输入 n 行 m 列的字符图,每行不含空格,长度都是 m,1 <= n, m <= 100。

#include <iostream>

using namespace std;

char s[110][110];

int main() {
    int n, m;
    cin >> n >> m;

    for (int i = 0; i < n; i++) cin >> s[i];

    for (int i = 0; i < n; i++) cout << s[i] << '\n';

    return 0;
}

s[i] 是第 i 行,s[i][j] 是第 i 行、第 j 列的字符。

这里每行按字符串读入,空格、换行都会作为分隔。图中本身含有空格,就不能照搬这种读法。

逐个字符遍历

遇到 @ 输出 1,其他字符输出 0。

for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        if (s[i][j] == '@') cout << 1;
        else cout << 0;
    }
    cout << '\n';
}