在这里,函数(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
答案 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)
composer require ext-dom
不是字符常量,即使NULL
是空字符也是如此。它是一个空指针常量的宏,出于历史原因,通常将其定义为\0
,尽管它可能是0
或任何其他空指针常量。
将字符归零并不会阻止它们成为字符串的一部分。为此,您必须移动其余的并调整长度。
如果只想执行一次,则在第一个匹配项后,再使用nullptr
保留该功能。
请考虑将其分为两个功能:一个用于查找匹配项,一个用于调用并使用结果删除第一个匹配项。
答案 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
功能。