从C ++中的字符串中删除所有字符(a-z,A-Z)

时间:2016-01-04 20:50:55

标签: c++ arrays string reference character

这是我的代码:

#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等数组。)

3 个答案:

答案 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;
}