zoukankan      html  css  js  c++  java
  • 【九度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的值将不断增加,然后导致越界。

  • 相关阅读:
    js根据年份获取某月份有几天
    java 时间转换去杠
    简单Maven Dos命令语句
    Maven命令参数
    Redis学习推荐
    Java中Redis缓存
    oracle新建登录用户sql语句
    ORacle修改表列长度
    jsp利用application统计在线人数的方法
    Oracle之分页查询
  • 原文地址:https://www.cnblogs.com/wenjianmuran/p/5373252.html
Copyright © 2011-2022 走看看