这是我的代码:
#include <iostream>
using namespace std;
string moveString(string t, int index)
{
for (int i=index; t[i]!=NULL;i++)
{
t[i]=t[i+1];
}
return t;
}
string delChars(string t)
{
for (int i=0; t[i]!=NULL; i++)
{
if (t[i]>'a' && t[i]<'z')
{
moveString(t, i);
}
else if (t[i]>'A' && t[i]<'Z')
{
moveString(t, i);
}
}
return t;
}
int main()
{
int numberOfSpaces;
string t;
cout << "Text some word: "; cin>>t;
cout<<delChars(t);
return 0;
}
第一个函数moveString
应该(理论上)从字符串中删除每个字符1个索引(从给定索引开始) - 删除1个字符。其余的很明显。但是:
输入:abc123def
输出:abc123def
我做错了什么?
还有一个小问题:实际上,什么是&#34;删除&#34;的最佳方法。数组中的元素? (int
s,char
s等数组。)
答案 0 :(得分:2)
moveString
按值t
获取,并且您没有分配其返回值,因此它不会在t
中更改delChars
。所以,确保你学到的下一件事是参考。
除此之外,我不知道该怎么讲t[i] != NULL
(如果它是未定义的行为),但我们std::string::size
得到{{1}的长度例如std::string
。如果您有i < t.size()
,则条件应为t[i + 1]
。
无论如何,不要像使用i + 1 < t.size()
数组一样玩它,留下以前大小的字符串。移动字符后,您可以char
最后一个(重复)字符。
值得一提的是,它可以在一行惯用的C ++算法中完成,但是你想让你的代码工作......
答案 1 :(得分:2)
逻辑东西是对的,但他的答案还不够。在i
之后你不应该增加move
。由于i.th character
已移除,i
现在指向下一个字符。
string delChars(string t)
{
for (int i=0; t[i]!=NULL; )
{
if (t[i]>'a' && t[i]<'z')
{
t = moveString(t, i);
}
else if (t[i]>'A' && t[i]<'Z')
{
t = moveString(t, i);
}
else
i++;
}
return t;
}
答案 2 :(得分:1)
我做错了什么?
不使用标准算法
实际上,&#34;删除&#34;的最佳方式是什么?数组中的元素? (整数,字符等数组)
使用标准的删除 - 删除习语:
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <cstring>
int main()
{
using namespace std;
auto s = "!the 54 quick brown foxes jump over the 21 dogs."s;
cout << "before: " << quoted(s) << endl;
s.erase(std::remove_if(s.begin(),
s.end(),
[](auto c) { return std::isalpha(c); }),
s.end());
cout << "after: " << quoted(s) << endl;
return 0;
}
预期产出:
before: "!the 54 quick brown foxes jump over the 21 dogs."
after: "! 54 21 ."
我不允许使用标准算法
然后保持简单:
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <cstring>
std::string remove_letters(const std::string& input)
{
std::string result;
result.reserve(input.size());
for (auto c : input) {
if (!std::isalpha(c)) {
result.push_back(c);
}
}
return result;
}
int main()
{
using namespace std;
auto s = "!the 54 quick brown foxes jump over the 21 dogs."s;
cout << "before: " << quoted(s) << endl;
auto s2 = remove_letters(s);
cout << "after: " << quoted(s2) << endl;
return 0;
}