題目1111:單詞替換
輸入一個字符串,以回車結束(字符串長度<=100)。該字符串由若干個單詞組成,單詞之間用一個空格隔開,所有單詞區分大小寫。現需要將其中的某個單詞替換成另一個單詞,並輸出替換之後的字符串。
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的值將不斷增加,然後導致越界。