当目标字被写两次时,程序无法继续

时间:2017-01-24 04:19:27

标签: c++ istringstream

我的源代码:

#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;。我怎么能解决这个问题?

1 个答案:

答案 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)) 。可以提前检查这种情况,程序可以进入一个不同的路径,只需将用户的输入打印回来。用户无法分辨出差异。