C++ 中有关字符串的内置类型 / 函数

std::string

#include <string>

std::basic_string<char>

std::basic_string - cppreference.com
zh.cppreference.com

C++ 存储字符串类型,满足内存空间连续性,可以使用 C 类型的下标访问对应位的字符。

输入

string str;
// 使用 cin 输入
cin >> str;
// 使用 getline 输入
getline(cin, str);
C++

有两种输入方式:

  1. 使用 cin 输入:
    cin >> str;
  2. 使用 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>

std::basic_stringstream - cppreference.com
zh.cppreference.com

实现字符串的流式操作,用于便捷地将各种数据类型推入一个字符串,也可以用于从字符串提取对应数据类型的数据。

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>

std::scanf, std::fscanf, std::sscanf - cppreference.com
zh.cppreference.com
std::printf, std::fprintf, std::sprintf, std::snprintf - cppreference.com
zh.cppreference.com

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++
暂无评论

发送评论 编辑评论


				
上一篇