#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);将数组 从 开始,以一字节数据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"
Related
In following homework: