C++ 无法逐个字符从另一个字符中正确删除字符串

C++ 无法逐个字符从另一个字符中正确删除字符串,c++,C++,这里的函数(sub)以两个字符串作为输入,遍历两个字符串,我试图找出string1和string2中是否有匹配项。如果有任何错误,string1的该字符将替换为空字符。现在,这适用于非重复字符。但如果string1有多个匹配的字符,则所有字符都将替换为空字符,而我只需要一个替换。例如,如果string1和string2是122和2,在消去后我需要12,现在我得到一个1 void sub (string str1, string str2){ int i,j,k; for(i=0;

这里的函数(sub)以两个字符串作为输入,遍历两个字符串,我试图找出string1和string2中是否有匹配项。如果有任何错误,string1的该字符将替换为空字符。现在,这适用于非重复字符。但如果string1有多个匹配的字符,则所有字符都将替换为空字符,而我只需要一个替换。例如,如果string1和string2是122和2,在消去后我需要12,现在我得到一个1

void sub (string str1, string str2){
    int i,j,k;
    for(i=0; i<=str2.size() ; i++){   
        for(j=0; j<=str1.size() ; j++ ){ 
            if( str2[i] == str1[j] )
                str1[j] = NULL;
        }
    }
    cout<<str1;
void子(字符串str1、字符串str2){
int i,j,k;
对于(i=0;i
  • NULL
    不是字符常量,即使
    \0
    是空字符。它是空指针常量的宏,出于历史原因,通常被定义为
    0
    ,尽管它可能是
    nullptr
    或任何其他空指针常量

  • 清零字符不会阻止它们成为字符串的一部分。为此,必须移动其余字符并调整长度

  • 如果您只想执行一次,在第一次匹配时,请在之后使用
    return
    来设置函数

  • 考虑将其分为两个函数:一个用于查找匹配项,另一个用于调用该函数并使用结果删除第一个匹配项


  • 据我所知,您想从str1中删除一个字符,对应于str2中的一个匹配项

    void sub(string str1, string str2)
    {
        int i = 0, j = 0;
        while (j < str2.size())
        {
            if (str1[i] == str2[j])
            {
                str1[i] = NULL;  // could use str1.erase(i,1)
                i = 0;
                j += 1;
                continue;
            }
            else
                i += 1;
            if (i == str1.size() - 1)
            {
                i = 0;
                j += 1;
            }
        }
        cout<<str1<<endl;
    }
    
    void子(字符串str1、字符串str2)
    {
    int i=0,j=0;
    而(jcout您不能通过将字符串设置为
    NULL
    来删除字符串中的字符。字符串的长度将保持不变。但是模拟删除重复项的一种方法是返回与返回条件匹配的新字符串

    首先迭代第二个字符串,并使用哈希表将
    s2
    中的每个字符映射为true。然后迭代
    s1
    ,仅当哈希表中的字符映射为false时,才将当前字符添加到新字符串中。在此条件后,将字符重新映射为false可确保除一个字符以外的所有字符数ers被写入结果字符串

    string remove_first_duplicates(string s1, string s2) {
      unordered_map<char, bool> m;
      string result;
      for (char i : s2) m[i] = true;
      for (char i : s1) {
        if (!m[i]) result += i;
        m[i] = false;
      }
      return result;
    }
    
    字符串先删除重复项(字符串s1、字符串s2){
    无序地图m;
    字符串结果;
    对于(字符i:s2)m[i]=true;
    用于(字符i:s1){
    如果(!m[i])结果+=i;
    m[i]=假;
    }
    返回结果;
    }
    
    您正在使事情变得更加困难。
    字符串
    库提供了两个函数,可以在一次调用中完全满足您的需要

    成员函数将在
    string1
    中找到
    string2
    中第一个出现的字符,并返回找到该字符的位置

    该函数可以删除从该位置开始的
    string1
    中的所有字符

    然后,您的
    sub
    功能将减少到:

    void sub (std::string& s1, const std::string& s2)
    {
        s1.erase (s1.find_first_of (s2));
    }
    
    使用给定字符串的简短示例如下:

    #include <iostream>
    #include <string>
    
    void sub (std::string& s1, const std::string& s2)
    {
        s1.erase (s1.find_first_of (s2));
    }
    
    int main (void) {
    
        std::string s1 ("122"), s2 ("2");
    
        sub (s1, s2);
    
        std::cout << "s1: " << s1 << "\ns2: " << s2 << '\n';
    }
    

    仔细检查一下,如果您还有其他问题,请告诉我。

    如果我们有
    str1=121
    str2=1
    ,那么
    12和
    21
    都是有效结果吗?当我们从位置0遍历到大小()时,21应该是唯一有效的结果.第一次匹配字符串中的单个字符,,,这只被替换了&我们不想再替换了。这确实有帮助。这正是我想要做的。非常感谢!:xd
    $ ./bin/sub1at2
    s1: 1
    s2: 2