C++ 无法逐个字符从另一个字符中正确删除字符串
这里的函数(sub)以两个字符串作为输入,遍历两个字符串,我试图找出string1和string2中是否有匹配项。如果有任何错误,string1的该字符将替换为空字符。现在,这适用于非重复字符。但如果string1有多个匹配的字符,则所有字符都将替换为空字符,而我只需要一个替换。例如,如果string1和string2是122和2,在消去后我需要12,现在我得到一个1C++ 无法逐个字符从另一个字符中正确删除字符串,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;
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;
而(j cout您不能通过将字符串设置为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