用 space 字符替换子字符串
Replacing a substring with a space character
我得到了一个字符串,我必须从中删除一个子字符串。即WUB,并用space字符替换。
有 2 个 WUB's between ÁRE' 和 'THE'。所以 if 语句中的第一个条件是不打印两个空白 space 而是在执行代码时打印两个空白 space。
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]==' ')
也就是说,与 space 字符的数值或 space 字符本身进行比较。
此外,当您的 i
增长到接近字符串的长度时,子表达式 s[i+1]
和 s[i+2]
可能会达到字符串的 non-exiting 个字符。您应该使用 i<s.length()-2
条件继续循环。
编辑
要获得完整的解决方案,您需要充分理解要解决的问题。问题表述有点模糊:
remove a substring ("WUB"
) from (a given string). And put a space inplace of it if required.
你考虑了最后一个条件,但还不够深入。 'if required'是什么意思?如果结果字符串为空 或 您已经向其附加了 space(当您遇到第二个进一步连续的 WUB
时),则不需要替换。如果您在 WUB
,也没有必要,但后面没有更多内容 - 除了可能另一个 WUB
s...
因此,当您找到 "WUB"
子字符串时,判断是否需要 space 还为时过早。你知道你需要一个 space 当你发现一个非 WUB
文本 following some WUB
(or WUB
s) 并且那里在 那些 WUB
(s).
之前是一些文本
2 件事会破坏您的代码:
- 您正在执行这样的 for 循环
int i=0;i<s.size()
但正在阅读 (s[i]=='W' && s[i+1]=='U' && s[i+2]=='B')
- 这里:
if(p[ct]=='32')
你的意思肯定是 if(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')
- 中有一个multicharacter-literal
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一样使用其他变量作为计数器。在这种情况下,ct 可以通过在 for 循环内使用 p[ct] 来达到索引越界错误。
创建一个字符串并使用 append() 函数将是一个更好的解决方案。在这种情况下,我们遍历字符串中的每个字符,如果找到“WUB”,则我们附加一个“”。否则,我们追加字符。
我强烈建议使用 C++ 中的 substring() 编写第一个 if() 语句。
这使代码更易于阅读。
Substring 创建并 returns 一个从特定位置开始到结束位置的新字符串。这是语法
语法: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;
}
}
我得到了一个字符串,我必须从中删除一个子字符串。即WUB,并用space字符替换。
有 2 个 WUB's between ÁRE' 和 'THE'。所以 if 语句中的第一个条件是不打印两个空白 space 而是在执行代码时打印两个空白 space。
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]==' ')
也就是说,与 space 字符的数值或 space 字符本身进行比较。
此外,当您的 i
增长到接近字符串的长度时,子表达式 s[i+1]
和 s[i+2]
可能会达到字符串的 non-exiting 个字符。您应该使用 i<s.length()-2
条件继续循环。
编辑
要获得完整的解决方案,您需要充分理解要解决的问题。问题表述有点模糊:
remove a substring (
"WUB"
) from (a given string). And put a space inplace of it if required.
你考虑了最后一个条件,但还不够深入。 'if required'是什么意思?如果结果字符串为空 或 您已经向其附加了 space(当您遇到第二个进一步连续的 WUB
时),则不需要替换。如果您在 WUB
,也没有必要,但后面没有更多内容 - 除了可能另一个 WUB
s...
因此,当您找到 "WUB"
子字符串时,判断是否需要 space 还为时过早。你知道你需要一个 space 当你发现一个非 WUB
文本 following some WUB
(or WUB
s) 并且那里在 那些 WUB
(s).
2 件事会破坏您的代码:
- 您正在执行这样的 for 循环
int i=0;i<s.size()
但正在阅读(s[i]=='W' && s[i+1]=='U' && s[i+2]=='B')
- 这里:
if(p[ct]=='32')
你的意思肯定是 if(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')
- 中有一个multicharacter-literal
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一样使用其他变量作为计数器。在这种情况下,ct 可以通过在 for 循环内使用 p[ct] 来达到索引越界错误。 创建一个字符串并使用 append() 函数将是一个更好的解决方案。在这种情况下,我们遍历字符串中的每个字符,如果找到“WUB”,则我们附加一个“”。否则,我们追加字符。
我强烈建议使用 C++ 中的 substring() 编写第一个 if() 语句。 这使代码更易于阅读。
Substring 创建并 returns 一个从特定位置开始到结束位置的新字符串。这是语法
语法: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;
}
}