c++ 我在if块中使用了std::string::substr方法,但是if块不起作用

oymdgrw7  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(161)

有一个字符串包含单词“WUB”,我需要从字符串中删除这个单词。
所以我在if块中使用了substring方法,这样在遍历循环时,if块可以捕获WUB并打印1

#include <bits/stdc++.h>

using namespace std;

int main()
{
    string s="WUBhello";
    for(int i=0;i<s.length();i++){
    
        if(s.substr(i,i+2)=="WUB"){
            cout<<"1 ";
            i+=2;
        }
        else{
            cout<<s[i];
        }
    }
    return 0;
 }

我以为它只会打印“hello”,但它打印的是“WUBhello”

slmsl1lt

slmsl1lt1#

您也可以使用std::stringstream
注意:在使用任何标准库函数之前,请务必检查其函数签名。std::substr的第二个参数是子字符串的长度。

#include <string>
#include <sstream>
#include <iostream>

std::string remove_substring(const std::string& s, const std::string& key)
{
    std::stringstream ss;
    for (int i = 0; i < s.length(); )
    {
        if (s.substr(i, key.length()) == key)
        {
            i += key.length();
        }
        else 
        {
            ss << s[i];
            i++;
        }
    }
    return ss.str();
}
int main()
{
    const std::string s = "WUBhello";
    const std::string key = "WUB";
    std::cout << remove_substring(s, key);
 }
sczxawaw

sczxawaw2#

    • 1.您的代码中存在的问题:**

有几个问题,一些错误和一些不良做法(见下面的边注)。
首先,std::string::substr的第二个参数是count--即字符数,因此在您的情况下,它应该是3,而且在使用substr之前,您也不需要检查i < s.length()-3
那么你的循环的整个逻辑都是有缺陷的。使用调试器将帮助你获得更多的洞察力。参见:What is a debugger and how can it help me diagnose problems?.

    • 2.更好的办法:**

如果要从字符串中删除子字符串,可以执行以下操作:
1.使用std::string::find查找子字符串。
1.然后使用std::string::erase将其删除。

    • 代码示例:**
#include <iostream>
#include <string>

int main()
{
    std::string str = "WUBhello";
    std::string toRemove = "WUB";

    // Find the substring:
    auto pos = str.find(toRemove);
    if (pos != std::string::npos)
    {
        // Remove it:
        str.erase(pos, toRemove.length());
    }

    std::cout << str << std::endl;
    return 0;
}
    • 输出:**
hello

如果要删除多次出现的子字符串,可以在循环中应用类似的逻辑:

// Find the 1st occurance substring:
auto pos = str.find(toRemove);
while (pos != std::string::npos)
{
    // Remove it:
    str.erase(pos, toRemove.length());
    // Find the next one:
    pos = str.find(toRemove);
}
    • 一些旁注:**
  1. Why should I not #include <bits/stdc++.h>?
  2. Why is "using namespace std;" considered bad practice?
w1jd8yoj

w1jd8yoj3#

std::string::substr的第二个参数是独占的,所以应该是i+3,还有,即使逻辑正确,它也会打印“1 hello”。

相关问题