在C++中搜索字符串中的字符串

Searching for strings within a string in C++

本文关键字:字符串 C++ 搜索      更新时间:2023-10-16

每个人。我是一名经验丰富的C程序员,正在努力适应C++。我想做这个C语句的等价物。。。

sscanf(str, "%s %s", sub1, sub2);

但是使用C++的字符串对象。假设str是"hello-world",执行上面的sscanf语句会将"hello"放在sub1中,将"world"放在sub2中。我知道我可以像在C++中那样使用C函数,但我想使用C++字符串对象,而不是字符数组。我试过这个:

string q, h, w;
cout << "Type "hello world": ";
cin >> q;
istringstream x(q);
x >> h >> w;
if (h == "hello")
    cout << "Yes!n";
else
    cout << "No!n";
if (w == "world")
    cout << "Yes!n";
else
    cout << "No!n";

但它输出"是!不是!",这意味着它选择了"你好",但没有选择"世界"。有什么想法吗?

这是因为与cin一起使用的operator>>将只捕获"hello"短语,并将在第一个分隔符处停止(在本例中为空格)。如果要捕获用户键入的第一行分隔符之前的整个输入行,则必须使用getline(cin, q)getline()的两个参数版本使用换行符作为分隔符,但也有三个参数版本允许您指定自定义的行分隔符字符。

永远不要在不进行错误检查的情况下使用iostreams。正如Jason所说,阅读整行,而不仅仅是一个令牌,即使这样也要检查错误:

std::string line;
if (std::getline(std::cin, line))
{
    std::string h, w;
    std::istringstream iss(line);
    if (iss >> h >> w)
    {
        // success
    }
    else
    {
        std::cerr << "Error reading your input.n";
    }
}
else
{
    std::cerr << "Error reading from stdin!n";
}

如果你想继续阅读,你可以把if变成循环。

基本上,您可以将每个格式化的提取(getline>>)作为一个条件进行检查,因为结果可以转换为可测试的内容,如果操作失败,条件将为false。因此,除非操作成功,否则决不能解释声称的收件人变量!

如果您将此检查添加到代码x >> h >> w;中,您将永远不会通过该行而不失败。