我得到一个字符串,我必须从它中移除一个子字符串。即WUB,并将其替换为空格字符。
在、WUB、‘s之间有2个。因此,if语句中的第一个条件是不打印两个空格,而是在执行代码时打印两个空格。
Input: WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB
Output: WE ARE THE CHAMPIONS MY FRIEND 到目前为止,我的代码如下:
#include <iostream>
using namespace std;
int main()
{
const string check = "WUB";
string s, p;
int ct = 0;
cin >> s;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == 'W' && s[i+1] == 'U' && s[i+2] == 'B')
{
i += 2;
if (p[ct] == '32' || p.empty())
{
continue;
}
else
{
p += ' ';
ct++;
}
}
else
{
p += s[i];
ct++;
}
}
cout << p;
return 0;
}为什么第一个if语句从未执行?
发布于 2020-08-31 08:43:21
实际上这里有三个bug,所以用一个答案来总结它们可能是值得的:
if (si == 'W‘&& si+1 == 'U’&& si+2 == 'B')
对最后两个字符来说是越界的。一个解决办法是先检查长度:
如果(i< s.length() -2& si == 'W‘&& si+1 == 'U’& si+2 == 'B')
如果(pct == '32‘x\x p.empty())使用' '或32或std::isspace代替。最后一个是最好的。--
相同条件下的
pct == '32‘
总是超出界限:ct等于p.length()。(归功于一些程序员,他在注释中提到了这一点!)变量ct也是多余的,因为std::string知道它的长度。我建议使用std::string::back()访问最后一个字符,并按如下方式重新排序条件:
如果( std::isspace(p.back())) ) (p.empty() \x{e76f})
发布于 2020-08-31 08:12:47
这个条件
if(p[ct]=='32')应读为
if(p[ct]==32)或
if(p[ct]==' ')也就是说,将空间字符的数值或空间字符本身进行比较。
此外,当您的i接近字符串的长度时,子表达式s[i+1]和s[i+2]可能会到达字符串的非退出字符。您应该继续循环使用i<s.length()-2条件。
编辑
对于一个完整的解决方案,你需要完全理解你想要解决的问题。问题陈述有点含糊:
从(给定字符串)中移除子字符串(
"WUB")。如果需要的话就放个地方。
你考虑了最后一个条件,但还不够深入。这是什么意思,‘如果需要’?如果得到的字符串是空的,或者您已经给它添加了一个空格(当您遇到第二个连续的WUB时),则不需要替换。如果您在WUB,也没有必要,但是除了可能有另一个WUB的.
因此,当您找到一个"WUB"子字符串时,决定是否需要一个空格还为时过早。当您在一些WUB(或WUBs)后面找到一个非WUB文本时,您知道需要一个空格,并且在这些WUB(s)之前有一些文本。
发布于 2020-08-31 08:15:36
有两件事会破坏您的代码:
您正在执行像下面这样的for循环,但是在这里阅读(s[i]=='W' && s[i+1]=='U' && s[i+2]=='B')
if(p[ct]=='32'),您的意思是(pct==32)还是if(p[ct]==' ')https://stackoverflow.com/questions/63667096
复制相似问题