如何解决用空格字符替换子字符串
给了我一个字符串,我必须从中删除一个子字符串。即 WUB ,然后将其替换为空格字符。
ÁRE和THE之间有2个 WUB 。因此,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语句从不执行?
解决方法
这种情况
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
(或WUB
s个以下的非WUB
文本之后,并且在之前有一些文本时,需要一个空格那些WUB
。
两件事会破坏您的代码:
- 您正在像这样进行
int i=0;i<s.size()
的for循环,但阅读(s[i]=='W' && s[i+1]=='U' && s[i+2]=='B')
- 此处:
if(p[ct]=='32')
是指您确定(p [ct] == 32)还是if(p[ct]==' ')
这里实际上存在三个错误,因此可能值得在一个答案中总结一下:
-
第一个条件:
if (s[i] == 'W' && s[i+1] == 'U' && s[i+2] == 'B')
超出最后两个字符的范围。一种解决方法是先检查长度:
if(i < s.length() - 2 && s[i] == 'W' && s[i+1] == 'U' && s[i+2] == 'B')
-
if (p[ct] == '32' || p.empty())
改为使用
' '
或32
或std::isspace
。 IMO,最后一个是最好的。 -
在相同条件下
p[ct] == '32'
总是 越界:
ct
等于p.length()
。 (致谢某些程序员老兄,他在注释中提到了这一点!。)变量ct
也是多余的,因为std::string
知道它的长度。我建议使用std::string::back()
来访问最后一个字符并按如下顺序重新排列条件:if (p.empty() || std::isspace(p.back()))
该程序的算法在正确的轨道上。
但是,有一些问题。
-
for循环超出索引。解决此问题的一种方法是减去大小-3。像这样的东西。
for(int i = 0; i
-
我不建议使用其他变量作为ct之类的计数器。在这种情况下,通过在for循环内使用p [ct],ct可以达到超出错误范围的索引。 创建一个字符串并使用append()函数将是一个更好的解决方案。在这种情况下,我们遍历字符串中的每个字符,如果找到“ WUB”,则附加一个“”。否则,我们将附加字符。
-
我强烈建议使用C ++中的substring()编写第一个if()语句。 这使代码更易于阅读。
子字符串创建并返回一个从特定位置开始到结束位置的新字符串。这是语法
语法:substr(startingIndex,EndingIndex); endingIndex是排他性的
#include <string>
#include <iostream>
int main() {
string s,p;
cin >> s;
for(int i=0;i<s.size()-3;i++) {
if (s.substr(i,i+3) == "WUB") {
p.append(" ");
} else {
p.append(s.substr(i,i+1));
i++;
continue;
}
i+=3;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。