我编写了以下程序,它将删除string1中存在于string2中的所有常用字符。
#include<iostream>
#include<string>
#include<iterator>
using namespace std;
void DelCommonChar(char *input, string s2)
{
string s1(input);
string::iterator it1;
string::iterator it2;
for(it1=s1.begin();it1<s1.end();it1++)
{
for(it2=s2.begin();it2<s2.end();it2++)
{
if(*it1==*it2){it1=s1.erase(it1);it1--;}
}
}
cout<<s1<<endl; // Line Number 20
}
int main()
{
char c[32];
strncpy(c,"Life of Pie",32);
DelCommonChar(c,"def");
cout<<c<<endl; //Line Number 29
}
Output:Li o pi ......... printed through line number 20.
但是现在我想要查看c[32]
中的变量main function
并且我希望line number 29
打印输出。
你能帮助我,如何仅在函数c[32]
内更改变量DelCommonChar
?
注意:我不想更改函数返回数据类型void
。
答案 0 :(得分:1)
如果您无法修改功能签名。您可以使用“c_str()”返回C String。不建议这样做。
#include<iostream>
#include<string>
#include<iterator>
using namespace std;
void DelCommonChar(char *input, string s2)
{
string s1(input);
string::iterator it1;
string::iterator it2;
for(it1=s1.begin();it1<s1.end();it1++)
{
for(it2=s2.begin();it2<s2.end();it2++)
{
if(*it1==*it2){it1=s1.erase(it1);it1--;}
}
}
std::strcpy (input, s1.c_str());
}
int main()
{
char *c = (char *)malloc(32);
strncpy(c,"Life of Pie",32);
DelCommonChar(c,"def");
cout<<c<<endl;
}
答案 1 :(得分:0)
初始化s1
时:
string s1(input);
它将input
的内容复制到其内部缓冲区中。修改s1不会更改原始缓冲区。如果您想在输入中存储内容,请将其复制回来(strcpy
,strncpy
,memcpy
- 但它们都“不安全”,或者直接在input
上操作
更好的想法是避免使用C字符串(char*
)并将std :: strings与引用一起使用。
void DelCommonChar(std::string &input, string s2)
{
std::string &s1 = input;//you don't need that, you can use input directly.
...
}
答案 2 :(得分:0)
您可以维护两个指针,一个指针检查,一个指针写入。类似的东西:
int check=0,write=0;
while (input[check])
{
if (input[check] is not to be deleted)
{
input[write++]=input[check];
}
++check;
}
input[write]=0;