C++检测字符串首尾空格的代码无法识别尾空格,是什么原因?
代码问题根因
- 核心错误是误用了
std::string的end()迭代器:C++ 标准库所有容器的end()方法返回的都是尾后迭代器,指向容器最后一个元素的下一个内存位置,本身不承载任何有效元素,直接对end()解引用属于未定义行为,尾部空格的检测逻辑从根上就没有生效,所以输入尾部带空格的字符串时会误判为合法。 - 额外隐藏风险:代码没有处理空输入的边界场景,如果用户输入为空字符串,对
s.begin()解引用同样属于未定义行为,可能直接导致程序崩溃。 - 细节隐患:
std::isspace的入参要求是值不小于0的字符或者EOF,如果系统中char为有符号类型,传入负字符值会触发未定义行为,调用时需要先强转为unsigned char。
修复后可运行代码
#include <string> #include <cctype> #include <iostream> #include <iterator> bool is_valid(const std::string& s) { // 空字符串的合法性可根据业务需求调整返回值 if (s.empty()) return false; auto start = s.begin(); // 取最后一个有效字符的迭代器 auto last = std::prev(s.end()); return !std::isspace(static_cast<unsigned char>(*start)) && !std::isspace(static_cast<unsigned char>(*last)); } int main() { std::string name{}; std::getline(std::cin, name); if (!is_valid(name)) { std::cout << "Invalid!" << std::endl; } return 0; }
内容的提问来源于stack exchange,提问作者demid
相关产品推荐
相关产品推荐

