c++ - 为什么 std::string.find() 不能用于 "<"?

标签 c++ string macos

我有:

#include <iostream>
#include <string>

int main(int argc, const char * argv[])
{

    std::string foo = "<!";

    if (foo.find("<")) {
        std::cout<<"Found";
    }

    return 0;
}

为什么这段代码找不到 "<" ? 如果我将行更改为 foo.find("!") ,然后找到。那么"<"有什么问题呢? ?

最佳答案

如果成功 std::string::find() 返回找到其参数的索引,而不是 bool 值。

因为 "<"在索引 0 处找到它返回 0,并且在 bool 上下文中 0 为假,因此条件失败。因为"!"在索引 1 处返回 1,并且在 bool 上下文中为真。

而不是测试是否find返回 true 你需要使用:

if (foo.find("<") != std::string::npos) {

npos是保留的特殊值,表示“不是位置”和 find返回它表示未找到该值。

注意当你想搜索单个字符时,最好这样做,而不是搜索长度为 1 的字符串,即使用 foo.find('<')而不是 foo.find("<")

您可以通过尝试搜索 '<' 来自行调试它在字符串 "!<" 中你会发现结果与你搜索的特定字符无关,而只与它在字符串中找到的位置有关。

关于c++ - 为什么 std::string.find() 不能用于 "<"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25911533/

相关文章:

java - 使用递归来获取数组的子集。 C++ 和 Java 给我不同的结果

c++ - 在迭代器中从 std::list 中移除一个条目

用自定义字符串替换美元符号 ($) 变量的 Java EE 方法

c - C 中复制字符串的确切方法是什么?

php - Mac OSX Apache 写入权限

iphone - 在 XCode 4.2 中为 iOS 创建框架

c++ - 序列化所需的公共(public)空构造函数

c++ - 模板函数作为模板参数,标准是什么?

c# - 如何在 C# 中安全地嵌入静态字符串( key )?

ios - Xcode 4.5.2 在 Mac OS X Mountain Lion 上不断崩溃?