std::string
#include <string>
即 std::basic_string<char>
。
C++ 存储字符串类型,满足内存空间连续性,可以使用 C 类型的下标访问对应位的字符。
输入
string str;
// 使用 cin 输入
cin >> str;
// 使用 getline 输入
getline(cin, str);
C++有两种输入方式:
- 使用
cin
输入:cin >> str;
- 使用
getline
输入:getline(cin, str);
不可以使用 scanf
输入,在解除流同步以后要额外注意 scanf
/ cin
不能混用。
当然如果你不怕常数爆炸你可以先用 scanf
输入到字符数组再用 const char*
创建 std::string
类。
输出
string str;
// 使用 cout 输出
cout << str << endl;
// 使用 printf 输出
printf("%s\n", str.c_str());
C++可以使用 cout << str
也可以通过 c_str()
方法转为字符数组再用 printf
输出。
操作
string str = "";
// 字符串长度
str.length() // ~> 11
// 字符串是否为空
str.empty() // ~> true
// 清空字符串
str.clear();
str = "321, Hello!"
// 查找子串
str.find("Hello") // ~> 5
// 截取子串
str.substr(2, 3) // ~> "1, "
// 转换为整数
str.stoi() // ~> 321
C++可以用 length()
方法获取字符串长度(STL 通用的 size()
方法也可以)。
empty()
方法获取字符串是否为空,等价于 str.length() == 0
。
clear()
方法清空字符串(即赋值为 "\0
")。
find()
方法返回给定子串的第一次出现下标,若未找到则返回 npos
公共常量。
substr()
方法截取子串,substr(a)
则截取下标 $[ a , \text{length} )$ 的范围,substr(a, b)
则截取 $[ a, a + b )$ 的范围。
stoi()
、stoll()
、stof()
、stod()
、stold()
方法尽可能将字符串转为整数 / 浮点数。如果字符串不是以对应数字开头则抛出 std::invalid_argument
。
std::stringstream
#include <sstream>
即 std::basic_stringstream<char>
。
实现字符串的流式操作,用于便捷地将各种数据类型推入一个字符串,也可以用于从字符串提取对应数据类型的数据。
stringstream ss;
// 推入字符串流
string name = "ACME";
ss << "Hello, my name is " << name << " and my id is " << 998244353;
// 提取数据
int id;
ss >> id; // id = 998244353
// 提交为字符串
string build = ss.str();
C++sscanf / sprintf
#include <cstdio>
与 scanf
/ printf
类似,只是源 / 目标不是 stdin
/ stdout
而是指定的字符串。
// sscanf 读取指定字符串内的内容
string a = "Hello, my name is ACME and my id is 998244353.";
char name[10];
int id;
sscanf(a.c_str(), "Hello, my name is %s and my id is %d.", name, &id); // ~> 2
// sprintf 将指定格式化后的字符串写入
char welcome_message[50];
sprintf(welcome_message, "Welcome back, user %s (id: %d)!", name, id); // ~> 40
C++其中 sscanf()
返回成功匹配并获取的参数个数,sprintf()
返回成功写入的字符数。
实例:CSP-J 2021 T3 网络连接,判断 IP 是否合法
bool isvalid(string ipaddr) {
ll a, b, c, d, port;
if(sscanf(ipaddr.c_str(), "%lld.%lld.%lld.%lld:%lld", &a, &b, &c, &d, &port) != 5) {
return false;
}
if(
(a < 0 || a > 255) ||
(b < 0 || b > 255) ||
(c < 0 || c > 255) ||
(d < 0 || d > 255) ||
(port < 0 || port > 65535)
) {
return false;
}
stringstream ss;
ss << a << "." << b << "." << c << "." << d << ":" << port;
return ss.str() == ipaddr;
}
C++