一、字符串最后一个单词的长度
处理字符串输入时,cin 遇到空格就会停止读取,这在处理包含空格的句子时会出错。比如输入 A B C D,用 cin 只能读到 A。这时候我们需要用到输入流的全局函数 getline。
getline(istream&, string&) 定义在 <string> 头文件中,它的作用是从输入流中读取一整行内容存入 string 对象。除了基础用法,它还可以指定终止字符:
// 基础用法(读整行)
getline(输入流对象,string 对象);
// 扩展用法(读至指定终止符)
getline(输入流对象,string 对象,终止字符);
要计算最后一个单词的长度,常规思路是遍历字符串记录空格位置,但这比较冗余。我们可以利用 string 类重载的 rfind 成员函数,从末尾向前查找第一个空格。
rfind 是从字符串末尾向前查找指定内容的函数,返回匹配内容的起始下标,若未找到则返回 string::npos。参数支持子串、字符指针或字符,第二个参数可选,默认从末尾开始。
逻辑很简单:如果找到了空格,最后一个单词长度就是总长度减去空格位置再加 1;如果没找到空格,说明整个字符串就是一个单词,直接返回总长度。
这里要注意 string::npos 的使用。它是 std::string 类的静态常量,代表无效位置。判断是否找到目标时,必须用 pos != string::npos,千万不要写成 pos == -1,因为 size_t 是无符号类型,这样写不规范且容易出错。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
// cin >> str; // cin 检测到空格或换行就会结束,这里要用 getline
getline(cin, str);
size_t pos = str.rfind(' '); // 找到最后一个空格所处位置
if (pos != string::npos) {
cout << str.size() - (pos + 1) << endl;
} else {
cout << str.size() << endl;
}
return ;
}


