检查输入字符串在 C++ 中是否有前导或尾随空格?
Check if input string has leading or trailing whitespaces in C++?
我正在尝试验证 C++11 中的 单行 输入字符串,以查看它是否包含任何前导/尾随空格。我的代码现在看起来像这样:
bool is_valid(const std::string& s) {
auto start = s.begin();
auto end = s.end();
if (std::isspace(*start) || std::isspace(*end)) {
return false;
}
return true;
}
int main() {
std::string name{};
std::getline(std::cin, name);
if (!is_valid(name)) {
std::cout << "Invalid!";
}
return 0;
}
但现在程序只能检测前导空格。例如,对于 John
它将打印 Invalid!
但对于 Mary
它会将其归类为有效输入,但事实并非如此。有谁知道我的程序有什么问题吗?
s.end()
是 一次传递字符串的末尾 就像 C++ 中的任何其他容器一样,因此访问它会调用未定义的行为。您需要改用 std::prev(s.end())
(虽然只有字符串至少包含 1 个字符才有效,因此您需要先检查字符串长度)
结束迭代器没有指向容器中的元素。它指向最后一个元素。您不能取消引用结束迭代器。对于 std::string
你可以使用它 operator[]
:
char last_char = s[s.size()-1];
推进开始迭代器:
auto it = s.begin() + s.size()-1;
char last_char = *it;
或递减结束迭代器:
auto it = s.end() -1;
char last_char = *it;
其他选择是 back()
或使用反向迭代器 rbegin()
。
请注意,它们都需要 s.size() != 0
。对于空字符串 s.begin() == s.end()
。您应该首先在函数中检查,然后 return true
对于这种情况。
.end
用于让迭代器过去最后一个元素。您可以使用 std::string::rbegin
获取最后一个元素。
auto end = s.rbegin();
注意: std::string::starts_with
and std::string::ends_with
可从 C++20 获得。
可以在测试空字符串后对 std::string::front() and std::string::back() 进行简单测试:
bool is_valid(const std::string& s)
{
return s.empty() ||
(!std::isspace(static_cast<unsigned char>(s.front())) &&
!std::isspace(static_cast<unsigned char>(s.back())));
}
是的,.end()
是指向尾后元素。那为什么不使用 .back()
呢?
bool is_valid(std::string const& str) {
return str.empty() || !(std::isspace(str.front()) || std::isspace(str.back()));
}
我正在尝试验证 C++11 中的 单行 输入字符串,以查看它是否包含任何前导/尾随空格。我的代码现在看起来像这样:
bool is_valid(const std::string& s) {
auto start = s.begin();
auto end = s.end();
if (std::isspace(*start) || std::isspace(*end)) {
return false;
}
return true;
}
int main() {
std::string name{};
std::getline(std::cin, name);
if (!is_valid(name)) {
std::cout << "Invalid!";
}
return 0;
}
但现在程序只能检测前导空格。例如,对于 John
它将打印 Invalid!
但对于 Mary
它会将其归类为有效输入,但事实并非如此。有谁知道我的程序有什么问题吗?
s.end()
是 一次传递字符串的末尾 就像 C++ 中的任何其他容器一样,因此访问它会调用未定义的行为。您需要改用 std::prev(s.end())
(虽然只有字符串至少包含 1 个字符才有效,因此您需要先检查字符串长度)
结束迭代器没有指向容器中的元素。它指向最后一个元素。您不能取消引用结束迭代器。对于 std::string
你可以使用它 operator[]
:
char last_char = s[s.size()-1];
推进开始迭代器:
auto it = s.begin() + s.size()-1;
char last_char = *it;
或递减结束迭代器:
auto it = s.end() -1;
char last_char = *it;
其他选择是 back()
或使用反向迭代器 rbegin()
。
请注意,它们都需要 s.size() != 0
。对于空字符串 s.begin() == s.end()
。您应该首先在函数中检查,然后 return true
对于这种情况。
.end
用于让迭代器过去最后一个元素。您可以使用 std::string::rbegin
获取最后一个元素。
auto end = s.rbegin();
注意: std::string::starts_with
and std::string::ends_with
可从 C++20 获得。
可以在测试空字符串后对 std::string::front() and std::string::back() 进行简单测试:
bool is_valid(const std::string& s)
{
return s.empty() ||
(!std::isspace(static_cast<unsigned char>(s.front())) &&
!std::isspace(static_cast<unsigned char>(s.back())));
}
是的,.end()
是指向尾后元素。那为什么不使用 .back()
呢?
bool is_valid(std::string const& str) {
return str.empty() || !(std::isspace(str.front()) || std::isspace(str.back()));
}