无法正确地从一个字符到另一个字符消除一个字符串

时间:2019-05-25 22:44:12

标签: c++

在这里,函数(sub)将两个字符串作为输入,遍历两个字符串,我试图找出string1与string2相比是否有任何匹配项。如果有,则将string1的那个字符替换为NULL字符。现在,此方法适用于非重复字符。但是,如果string1具有多个匹配一次的字符,则全部替换为NULL字符,而我只需要替换一次即可。例如,如果string1和string2为122和2,则消除后我需要1 2,其中我现在得到一个1。

import random

songs = [
 {
   "id": 1,
   "Song1": {
      "Song_nam": "killer queen"
   },
   "Song_artist": "queen"
},
 {
   "id": 2,
   "Song1": {
      "Song_nam": "Africa"
   },
   "Song_artist": "Toro"
},
 {
   "id": 3,
   "Song1": {
      "Song_nam": "Perfect"
   },
   "Song_artist": "Ed sheeran"
}
]

song = random.choice(songs)
print(f"Name: {song['Song1']['Song_nam']}, Artist: {song['Song_artist']}")

如果str1 = 122和str2 = 2,则预期结果是1 2而不是1

4 个答案:

答案 0 :(得分:2)

您正在使事情变得更加困难。 string库提供了两个函数,它们可以在单个调用中完全满足您的需求。

成员函数std::basic_string::find_first_of将在string2中找到来自string1的字符的第一次出现,并返回找到字符的位置。

std::basic_string::erase函数可以从该位置开始的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';
}

使用/输出示例

$ ./bin/sub1at2
s1: 1
s2: 2

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

答案 1 :(得分:1)

  1. composer require ext-dom不是字符常量,即使NULL是空字符也是如此。它是一个空指针常量的宏,出于历史原因,通常将其定义为\0,尽管它可能是0或任何其他空指针常量。

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

  3. 如果只想执行一次,则在第一个匹配项后,再使用nullptr保留该功能。

  4. 请考虑将其分为两个功能:一个用于查找匹配项,一个用于调用并使用结果删除第一个匹配项。

答案 2 :(得分:1)

不能通过将字符设置为NULL从字符串中删除字符。字符串的长度将保持不变。但是,模拟删除重复项的一种方法是返回与返回条件匹配的新字符串。

首先遍历第二个字符串,然后使用哈希表将s2中的每个字符映射为true。然后遍历s1并仅在哈希表中的字符映射为false时才将当前字符添加到新字符串中。在这种情况下,将字符重新映射为false可以确保将字符数(除一个以外的所有字符)写入结果字符串。

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;
}

答案 3 :(得分:0)

据我所知,您想从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;
}

这将产生您想要的输出。但这会在str1中产生NULL char,更好的选择是使用erase中的std::string功能。