字符
字符类型是由一个字符组成的字符常量或者字符变量。在Cpp中,关键字char表示字符类型,它是用单引号表示的单个字符。例如:‘a’、'4'、'!',而' '是空字符。
使用关键字char可以定义字符类型,示例代码如下:
#include <iostream>
int main()
{
char a; // 声明字符变量a
// 给字符变量a赋值
a = 'A';
// 声明字符变量b并赋值
char b = 'B';
std::cout << a << std::endl << b;
return 0;
}
上述代码分别定义字符a和b,数值分别为'A' 和'B'其实字符分成两大类:可见字符和不可见字符。
- 可见字符是ASCII码的32至126的正整数,也就是能将字符进行输出处理,如字母A-Z、a-z等。
- 不可见字符是ASCII码的0~31及127(共33个)是控制字符或通信专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等。
字符之间还支持算术运算和比较运算,示例代码如下:
#include <iostream>
int main()
{
// 比较字符a和b
bool r = 'a' < 'b';
std::cout << r << std::endl;
// 字符a和b的和
int c = 'a' + 'b';
std::cout << c << std::endl;
// 字符a和b的差
int d = 'a' - 'b';
std::cout << d << std::endl;
// 字符a和b的乘积
int e = 'a' * 'b';
std::cout << e << std::endl;
// 字符d和"的商
float f = 'd' / "";
std::cout << f << std::endl;
}
字符串
C++有两种方式表示字符串类型,一种来自C语言,叫做C语言风格;另一种分格来自C++内置类string,称为string类型风格。
C语言风格是将字符串置于字符数组中,每个字符位于一个数组元素之中,并且以空字符('\0')结尾。它又分为字符数组和字符串指针,示例如下
#include <iostream>
int main()
{
// c语言分格字符数组
char a[] = "hello world";
std::cout << a;
// c语言分格字符串指针
char* b = "hello,world!";
std::cout << b;
}
string类型风格是c++增加了对字符串的支持,处理七字符串相对方便,完全可以代替C语言中的字符数组或字符串指针,示例代码如下:
#include <iostream>
int main()
{
// 初始化并创建字符串
std::string a = "hello,World!";
std::cout << a << std::endl;
}
格式化处理
字符串格式化处理是将字符串按照一定格式输出,C++提供多种方法格式化字符串,详细说明如下:
- 使用std::ostringstream,示例代码如下:
// 导入内置库
#include <iostream>
#include <sstream>
#include <string>
int main()
{
// ostringstream是字符串流类
std::ostringstream oss;
// 字符串依次写入ostringstream
oss << "1 + 2 = " << 3;
// 输出字符串
std::string result = oss.str();
std::cout << result << std::endl;
}
- 使用printf和sprintf,示例代码如下:
// 导入内置库
#include <cstdio>
#include <iostream>
int main()
{
// 直接输出格式化的字符串
printf("1 + 2 = %d\n",3);
//将格式化的字符串写入字符串数组
char buffer[100];
sprintf(buffer,"1 + 2 = %d",3);
std::cout << buffer << std::endl;
}
- 使用std::format,C++20引入的字符串格式化方法,示例代码如下:
// 导入内置库
#include <format>
#include <string>
#include <iostream>
int main() {
std::string result = std::format("1 + 2 = {}",3);
std::cout << result << std::endl;
}
除了上述方法之外,还有很多方法实现字符串格式化功能,此处不在一一详细讲述了,笔者建议采用C++20引入d的std::format。
字符串截取
//导入内置库
#include <string>
#include <iostream>
int main()
{
std::string str = "hello,World";
//找到字符串World的首个字母起始位置
int pos = str.find("World");
// 截取字符串Word
// str.substr第一个参数是字符串起始位置,第二个参数终止位置
std::string result = str.substr(pos,5);
std::cout << result;
}
字符串替换
C++的字符串查找可以使用find和rfind方法,find用于查找子串或字符在字符串中的位置;rfind是从字符串的末尾开始查找子串或字符,示例代码如下:
// 导入内置库
#include <iostream>
#include <string>
int main()
{
// find方法
std::string str = "Hello,World!";
int pos = str.find("World");
std::cout << "子串World在字符串Hello,World!的起始位置为:" << pos << std::endl;
// rfind方法
int pos1 = str.rfind("o");
// rfind是从末端开始查找,找到后则返回从左到右的位置
// 变量pos1的值等于8,则查找World里面的o
std::cout << "子串or在字符串Hello,World!的起始位置为:" << pos1 << std::endl;
}
字符串拼接
字符串拼接是将多个字符串组合新的字符串,C++字符串拼接可以使用+运算符、append方法、+=运算符、stringstream方法和字符串格式化实现,示例代码如下:
// 导入内置库
#include <cstdio>
#include <sstream>
#include <iostream>
#include <format>
int main()
{
// 使用+运算符拼接字符串
std::string str1 = "Hello, ";
std::string str2 = "World!";
std::string result = str1 + str2;
std::cout << result << std::endl;
// 使用append拼接字符串,新字符串覆盖原来的str1
str1.append(str2);
std::cout << str1 << std::endl;
// 使用+=运算符拼接字符串,新字符串覆盖原来的str1
str1 = "Hello, ";
str2 = "World!";
str1 += str2;
std::cout << str1 << std::endl;
// 使用流插入操作符拼接字符串
std::stringstream ss;
ss << "Hello, " << "World!";
result = ss.str();
std::cout << result << std::endl;
// 使用format格式化实现字符串拼接
str1 = "Hello, ";
str2 = "World! ";
result = std::format("{}{}",str1,str2);
std::cout << result << std::endl;
}
上述示例只演示了format格式化的其中一种方法,其它格式方法同样能实现字符串拼接功能。
大小写转换
// 导入内置库
#include <iostream>
#include <format>
#include <algorithm>
#include <cctype>
int main()
{
// 字符串转换为大写
std::string str = "Hello,World!";
std::transform(str.begin(),str.end(),str.begin(),::toupper);
std::cout << str << std::endl;
// 字符串转换为小写
std::transform(str.begin(),str.end(),str.begin(),::tolower);
std::cout << str << std::endl;
}
总结
到此,我们分别讲了C++的字符和字符串的定义和基本操作,其中字符串的同一个操作有多种不同实现方式,上述示例仅演示了部分实现方法。