将文本流中一个字符串的所有匹配项替换为另一个字符串

Replace all occurrences of one string with another in a stream of text

本文关键字:字符串 另一个 替换 一个 文本      更新时间:2023-10-16

正如标题所说,如何用另一个字符串替换一个字符串?例如:用户将输入三个输入。第一个输入是程序将替换的字符串;第二个是将替换输入 1 的字符串;第三个是要打印出来的字符串。因此,如果:

输入1 = 花生

输入2 = 椰子

输入3 = 替换花生替换

输出:更换椰子更换

我已经启动了它,但我的程序只能替换相同长度的单词。我尝试搜索我的问题,但我不明白给定的解决方案,因为我只是 C/C++ 的新手。

char replacing[100];
char replacement[100];
char original[1000];
int count;
cin >> replacing;
cin >> replacement;
while(! cin.eof())
{
cin >> original;
char * pch;

pch = strstr (original, replacing);
count = strlen(replacement);
strncpy (pch, replacement, count);

cout << original << endl;
}

怎么样:

  • 首先找到(如果有(该字符串的出现
  • 使用替换将匹配项替换为第二个字符串

这是应该有效的东西:

bool replaceFirst(string& input, const std::string& toBeReplaced, const std::string& replacement) {
size_t start_pos = input.find(toBeReplaced);
if(start_pos == std::string::npos)
return false; //substring not found! 
input.replace(start_pos, toBeReplaced.length(), replacement); //found. now i can replace!
return true;
}

由于您使用的是 char 数组而不是string因此您必须确保替换不会导致您超出界限(字符串会自动为您调整大小(。

关键问题是strncpy不会分配(或释放(任何内存。这意味着如果replacementreplacing短,replacing的一部分不会被覆盖。同样,如果replacement更长,它将覆盖超过replacing末尾。

如前所述,你最好使用 std::string(或者其他一些C++字符串类,如 Qt 的 QString,如果 Qt 是你的一杯茶(。

另一件小事,一般来说,对于流,最好不要只检查eof,而是写一些类似的东西

while (cin >> original) {

如果流处于任何失败状态,这将终止,而不仅仅是eof

相关文章: