在 C++ 刷题过程中,字符串处理是高频考点。掌握 std::string 的常用操作和底层逻辑,能显著提升解题效率。下面通过四个典型例题,梳理字符串输入、查找、验证及变换的核心技巧。
一、字符串最后一个单词的长度
使用 cin 读取字符串时,遇到空格会自动停止,这会导致包含空格的句子被截断。例如输入 "A B C D",cin 只会读到 "A"。此时应改用 getline 函数从输入流中读取整行内容。
getline 并非成员函数,而是定义在 <string> 头文件中的全局函数,原型为 getline(istream&, string&)。它支持指定终止字符,默认以换行符结束。
思路解析:
要获取最后一个单词长度,常规做法是遍历统计空格位置,但较为冗余。利用 string 类的 rfind 成员函数可简化逻辑:从末尾向前查找第一个空格。若找到,长度为总长减去空格位置加一;若未找到(整串无空格),则直接返回总长。
rfind 从后往前搜索,返回匹配内容的起始下标,未找到时返回 string::npos。注意判断条件应为 pos != string::npos,而非 -1,因为 size_t 是无符号类型。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin, str);
size_t pos = str.rfind(' ');
if (pos != string::npos) {
cout << str.size() - (pos + 1) << endl;
} else {
cout << str.size() << endl;
}
return 0;
}
二、验证回文串
题目要求忽略非字母数字字符并统一大小写后判断是否回文。虽然标准库有现成函数,但理解底层逻辑更有助于应对变体问题。
实现步骤:
- 预处理字符串:遍历原串,将大写字母转换为小写(ASCII 码 +32),仅保留字母和数字。
- 双指针验证:定义左右指针分别指向新串首尾,向中间靠拢比较字符。若发现不等则直接返回 false。
class Solution {
public:
{
string clean_str;
( ch : s) {
(ch >= && ch <= ) {
clean_str += ch + ;
} (ch >= && ch <= ) {
clean_str += ch;
} (ch >= && ch <= ) {
clean_str += ch;
}
}
left = ;
right = clean_str.() - ;
(left < right) {
(clean_str[left] != clean_str[right]) {
;
}
left++;
right--;
}
;
}
};


