【九度OJ】题目1111:单词替换

题目1111:单词替换

题目描述:

输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

输入:
多组数据。每组数据输入包括3行,
第1行是包含多个单词的字符串 s,
第2行是待替换的单词a,(长度<=100)
第3行是a将被替换的单词b。(长度<=100)
 
s, a, b 最前面和最后面都没有空格.
输出:
每个测试数据输出只有 1 行,
将s中所有单词a替换成b之后的字符串。
样例输入:
You want someone to help you
You
I
样例输出:
I want someone to help you

#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string s, a, b;
    while(getline(cin, s))
    {
        getline(cin, a);
        getline(cin, b);
 
        for(int i = 0; i < s.length(); i++)
        {
            if(s.length() - i >= a.length())
            {
                if(s.substr(i, a.length()) == a
                   && (i == 0 || s[i - 1] == ' ')
                   && (i == s.length() - a.length() || s[i + a.length()] == ' '))
                {
                    s.replace(i, a.length(), b);
                }
            }
            else
                break;
        }
        cout << s << endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1111
    User: 文剑木然
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1520 kb
****************************************************************/

【总结】

对于C++中的字符串操作还比较陌生,代码写得比较繁琐。

主要注意要点:

1、cin >> s 会将空格作为输入结束,所以要用getline(cin, s)。

getline还有一些细节上的问题需要注意。

2、要注意判断单词边界

之前的错误答案:

#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string s, a, b;
    while(getline(cin, s))
    {
        getline(cin, a);
        getline(cin, b);
        if(s.length() >= a.length())
        {
            for(int i = 0; i <= s.length() - a.length(); i++)
            {
                if(s.substr(i, a.length()) == a
                        && (i == 0 || ' ' == s[i - 1])
                        && (i == s.length() - a.length() || ' ' == s[i + a.length()]))
                {
                    s.replace(i, a.length(), b);
                }
            }
        }
        cout << s << endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1111
    User: 文剑木然
    Language: C++
    Result: Runtime Error
****************************************************************/

【错误分析】

当输入为

you
you
i

时,会发生错误。

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr: __pos (which is 2) > this->size() (which is 1)

因为,执行替换后,循环终止条件

i <= s.length() - a.length()

恒满足,也就是i的值将不断增加,然后导致越界。

原文地址:https://www.cnblogs.com/wenjianmuran/p/5373252.html