我的源代码:
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[]){
string target_word=argv[1]; //The word you want to change
string changed_word=argv[2]; ///The word you want to change it to
//target_word=target_word+' ';
string line; //Used hold each line during processes
string word; //Used to hold each word in the line during processes
size_t position; //Used to hold the position of the first character in the word
while(getline(cin, line)){ //Grab each line one at a time
istringstream iss(line);
while(iss>>word){ //Grab each word from the line one at a time
if(word==target_word){ //Check if the current word is the target word
position=line.find(target_word); //Find the starting position of the word
line.replace(position, word.length(), changed_word); //Change the target word to the word you chose to change it to
}
}
cout<<line<<"\n"; //Output the altered line
}
//cout<<target_word<<"END"<<'\n';
return 0;
}
我需要此程序来阅读文本文件,然后将target_word
替换为changed_word
。它似乎适用于几乎所有的测试用例,除非target_word
被写两次而中间没有空格,即如果target_word
是&#34;输入&#34;并且changed_word
是&#34;输出&#34;然后程序改变&#34;输入输入&#34;到&#34;输出输出&#34;然后不会改变&#34;输入&#34;的任何其他样本。到&#34;输出&#34;。我怎么能解决这个问题?
答案 0 :(得分:0)
while(iss>>word)
将采用以空格分隔的单词并将其存储在word
中。如果输入是&#34;输入输入&#34;,则流将写入&#34;输入&#34;进入word
并停在太空。在下一次迭代中,下一个&#34;输入&#34;将被阅读。但是如果输入是&#34;输入输入&#34;没有空格来划分第一个&#34;输入&#34;所以&#34;输入输入&#34;被读入word
。这与输入&#34;不匹配,对于一件事来说太长了,所以不会发生替换。
编辑:我想我看到了一些混乱。让我们来看看&#34;海象鱼鱼缸的产量&#34;哪里&#34; fish&#34;是要取代的词,&#34; bird&#34;是替代品。
Iteration 1: walrus != fish. No replacement. Line = "walrus fishfish fish tank"
Iteration 2: fishfish != fish. No replacement. Line = "walrus fishfish fish tank"
Iteration 3: fish == fish. Replace first fish. Line = "walrus birdfish fish tank"
Iteration 4: tank != fish. No replacement. Line = "walrus birdfish fish tank"
第三条&#34;鱼&#34;结束了第一次&#34; fish&#34;因为它是唯一公认的鱼。这为我们提供了一个关于我们应该使用什么而不是stringstream
和>>
编辑结束。
您最好不要使用stringstream
和>>
来解析这一行,而是最好坚持find
auto pos = line.find(target_word);
while (pos != string::npos)
{
line.replace(pos, target_word.length(), changed_word);
pos = line.find(target_word);
}
或更简单但不太明显:
while ((auto pos = line.find(target_word)) != string::npos)
{
line.replace(pos, target_word.length(), changed_word);
}
请注意,如果target_word
位于行target_word == changed_word
,则会导致无限循环,因为它始终会找到target_word
并将target_word
替换为test07cel20: ((host=test07db04.com,port=1832,community=public,(host=test07db02.com,port=1832,community=public),(host=172.186.100.63,port=162,community=public,type=ASR))
。可以提前检查这种情况,程序可以进入一个不同的路径,只需将用户的输入打印回来。用户无法分辨出差异。