C++ —— 字符型和字符串
字符型和字符串
- 基本概念
- 字符的本质
- 转义字符
- 原始字面量
- 字符串型
- C++风格字符串的常用操作:
基本概念
字符型(char)
占用的内存空间是1
个字节,书写只能用单引号
包含,一个单引号
中只能有一个字符
。
#include <iostream>
using namespace std;int main() {char c = 'a'; // 声明字符型变量c 并赋值为'a'cout << "c = " << c << endl;cout << "sizeof(c) = " << sizeof(c) << endl;
}
运行结果如下:
c = a
sizeof(c)= 1
在计算机中,任何数据都是用二进制
来存放
的,最小的存储单元是字节
。在内存
中,不存放字符本身,而是存放与它对应的
编码,即ASCII码
。
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是现今最通用的单字节编码方案,包含了33个控制字符(具有特殊含义无法显示的字符)和95个可显示字符。例如:字符a
在内存中存放的是97
,对应的二进制是01100001
。
- 32:space(空格)
- 48~57:0~9(10个阿拉伯数字)
- 65~90:A~Z(26个大写英文字母)
- 97~122:a~z(26个小写英文字母)
字符 | 空格 | 0 | 9 | A | Z | a | z |
---|---|---|---|---|---|---|---|
对应的ASCII码 | 32 | 48 | 57 | 65 | 90 | 97 | 122 |
字符的本质
- 字符的
本质是整数
,取值范围是0~127
,占用的内存空间
是1
字节,可以把它看成是1
字节的整数;
#include <iostream>
using namespace std;int main() {char c1 = 'a';cout << "c1 = " << c1 << endl;cout << "sizeof(c1) = " << sizeof(c1) << endl;int c2 = 'a';cout << "c2 = " << c2 << endl;cout << "sizeof(c2) = " << sizeof(c2) << endl;return 0;
}
运行结果如下:
c1 = a
sizeof(c1) = 1
c2 = 97
sizeof(c2) = 4
- 在书写的时候可以用
单引号
包含,也可以用整数
(如果用整数
书写,应填对应的ASCII码值
); - 如果书写的时候用
单引号
包含,程序执行的时候,将把符号解释为对应
的整数
; - 显示的时候,把
整数
解释为对应
的符号
,也可以直接显示整数;
int c3 = 65;
cout << "c3 = " << (char) c3 << endl;
cout << "sizeof(c3) = " << sizeof(c3) << endl;
运行结果如下:
c3 = A
sizeof(c3) = 4
- 可以与
整数
进行任何运算,运算的时候,书写方式可以用字符
,也可以用整数
。
int c4 = 'A' + 5;
cout << "c4 = " << c4 << endl;
cout << "c4 = " << (char) c4 << endl;
cout << "sizeof(c4) = " << sizeof(c4) << endl;
运行结果如下:
c4 = 70
c4 = F
sizeof(c4) = 4
转义字符
在C++程序中,使用转义字符的原因有两个:
- 控制字符没有符号,无法书写,只能用其它的符号代替;
- 某些符号已被C++征用,语义冲突,只能用其它的符号代替。
ASCII码值 | 转义字符 | 含义 |
---|---|---|
0 | \0 | 空,给字符型变量赋值时可以直接书写0。 |
10 | \n | 换行(LF) ,将当前位置移到下一行开头。 |
13 | \r | 回车(CR) ,将当前位置移到本行开头 |
9 | \t | 水平制表(HT) (跳到下一个TAB位置) |
92 | \\ | 斜线 |
34 | \" | 双引号,书写字符时不必转义。 |
39 | \’ | 单引号,书写字符串中不必转义。 |
示例代码如下:
#include <iostream>
using namespace std;int main() {cout << "Hello World!" << "\n";cout << "你好!" << "\r" << "Hi~" << endl;cout << "666666\t777777\n";cout << "Hello World\\你好" << endl;cout << "Hi \"hhhhhhhhhhh\"" << endl; // 需要转义cout << "Hi 'hhhhhhhhhhh'" << endl; // 不需要转义char c = '\''; // 需要转义cout << "c = " << c << endl;return 0;
}
运行结果如下:
Hello World!
你好!
Hi~
666666 777777
Hello World\你好
Hi “hhhhhhhhhhh”
Hi ‘hhhhhhhhhhh’
c = ’
原始字面量
原始字面量(值)
可以直接表示字符串的实际含义
,不需要转义和连接。换句话说,就是如果原始的字符串中包含了转义字符,通过语法:R"(字符串的内容)"
或者R"xxx(字符串的内容)xxx"
,可以取消转义。示例代码如下:
#include <iostream>
using namespace std;int main() {string path_1 = "/home/user/documents";cout << "The path_1 is: " << path_1 << endl;string path_2 = "abcd\nsfkjm\tjsnv";cout << "The path_2 is: " << path_2 << endl;string path_3 = R"(abcd\nsfkjm\tjsnv)";cout << "The path_3 is: " << path_3 << endl;string path_4 = R"111qqxx(abcd\nsfkjm\tjsnv)111qqxx";// 两边的标识符一定要对称cout << "The path_4 is: " << path_4 << endl;string s1 = R"(cvwebraskutynrwteqbf\S超低温乳果糖5疾苦6i。utl)";cout << "The s1 is: " << s1 << endl;string s2 = "cvwebras" "kutynrwteqbf""S超低温乳果糖5疾苦6i。utl";// 直接将多个字符串常量分行书写,编译器会在编译时自动拼接它们。cout << "The s2 is: " << s2 << endl;return 0;
}
运行结果如下:
The path_1 is: /home/user/documents
The path_2 is: abcd
sfkjm jsnv
The path_3 is: abcd\nsfkjm\tjsnv
The path_4 is: abcd\nsfkjm\tjsnv
The s1 is: cvwebras
kutynrwteqbf
S超低温乳果糖5疾苦6i。utl
The s2 is: cvwebraskutynrwteqbfS超低温乳果糖5疾苦6i。utl
字符串型
C++中,字符串有两种表示方法:
- C++风格字符串:
string 变量名 = "字符串的内容";
- C风格字符串:
char 变量名[] = "字符串的内容";
C
风格字符串的本质是字符数组
,C++
风格字符串的本质是类
,它封装了C风格字符串。
C++风格字符串的常用操作:
- 赋值:
变量名 = "字符串的内容";
- 拼接:
变量名 = 变量名 + "字符串的内容1" + "字符串的内容2" + ... + "字符串的内容n";
如果字符串的内容都是常量,不要写加号+
,如果内容很长,可以分成多行书写
。 - 比较:支持
==
、!=
、>
和<
关系运算符,常用的是==
和!=
。
示例代码如下:
#include <iostream>
using namespace std;int main() {string s1 = "Hello"; // 定义字符串并初始化cout << "s1 = " << s1 << endl;s1 = "World"; // 修改字符串内容cout << "s1 = " << s1 << endl;cout << "Please input a string: ";string s2;cin >> s2;cout << "s2 = " << s2 << endl;if(s1 == s2) {cout << "s1 and s2 are the same." << endl;} else if(s1 > s2) {cout << "s1 is greater than s2." << endl;} else {cout << "s1 is less than s2." << endl;}// string s3 = "HelloWorld" + "qcd" + "新年快乐" + "12247gyv13fewv" + "嘿嘿jskbd-63rebag"; // 字符串的内容都是常量,不能写加号+,编译会报错string s3 = "HelloWorld" "qcd" "新年快乐" "12247gyv13fewv""嘿嘿jskbd-63rebag"; // 正确写法,字符串拼接,内容很长的话,换行书写。cout << "s3 = " << s3 << endl;;return 0;
}
运行结果如下:
s1 = Hello
s1 = World
Please input a string: Worldaaa
s2 = Worldaaa
s1 is less than s2.
s3 = HelloWorldqcd新年快乐12247gyv13fewv嘿嘿jskbd-63rebag
感谢浏览,一起学习!