从字符串c ++中删除非字母字符

时间:2015-02-13 03:25:12

标签: c++ string

我试图从c ++中的输入字符串中删除所有非字母字符并且不知道如何操作。我知道它可能涉及ascii数字,因为这是我们正在学习的内容。我无法弄清楚如何删除它们。我们只学习了循环,还没有开始阵列。不知道该怎么办。

如果字符串是Hello 1234 World&*
它会打印HelloWorld

4 个答案:

答案 0 :(得分:10)

如果您使用std::string和STL,则可以:

string s("Hello 1234 World&*");
s.erase(remove_if(s.begin(), s.end(), [](char c) { return !isalpha(c); } ), s.end());

http://ideone.com/OIsJmb

注意:如果您希望能够处理包含除英语之外的任何语言的文本的字符串,或者程序使用默认语言以外的语言环境,则可以使用isalpha(std::locale)

PS:如果您使用c样式字符串,例如char *,您可以通过其构造函数将其转换为std::string,并通过其成员函数c_str()转换回来。

答案 1 :(得分:1)

我不想破坏解决方案,所以我不会输入代码,只描述解决方案。对于你的问题,想想迭代你的字符串。从那开始。然后,您需要确定当前选定的字符是否是字母表的一部分。你可以做很多不同的方式。检查ASCII值?比较一串字母?一旦你决定它是否是一个字母,那么你需要重建带有该字母的新字符串加上你找到或将要找到的有效字母。最后,您需要显示新字符串。

答案 2 :(得分:1)

如果您正在使用C风格的字符串(例如char* str = "foobar"),那么您就无法删除"字符串中的字符(作为字符串只是在内存中按顺序存储的字符序列 - 删除字符意味着向前复制字节以填充已删除字符使用的空白空间。

您必须为新字符串分配空间,并根据需要将字符复制到其中。问题是,你必须在填充之前分配内存,所以除非你做一个初始传递来获得字符串中剩余字符数的计数,否则你要过度分配内存。

像这样:

void BlatentlyObviousHomeworkExercise() {

    char* str = "someString";
    size_t strLength = ... // how `strLength` is set depends on how `str` gets its value, if it's a literal then using the `sizeof` operator is fine, otherwise use `strlen` (assuming it's a null-terminated string).

    size_t finalLength = 0;
    for(size_t i = 0; i < strLength; i++ ) {
        char c = str[i]; // get the ith element of the `str` array.
        if( IsAlphabetical(c) ) finalLength++;
    }

    char* filteredString = new char[ finalLength + 1 ]; // note I use `new[]` instead of `malloc` as this is C++, not C. Use the right idioms :) The +1 is for the null-terminator.
    size_t filteredStringI = 0;
    for(size_t i = 0; i < strLength; i++ ) {
        char c = str[i];
        if( IsAlphabetical(c) ) filteredString[ filteredStringI++ ] = c;
    }
    filteredString[ filteredStringI ] = '\0'; // set the null terminator
}

bool IsAlphabet(char c) { // `IsAlphabet` rather than `IsNonAlphabet` to avoid negatives in function names/behaviors for simplicity
    return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}

答案 3 :(得分:0)

如果查看ascii table,可以看到A-Z介于65-90之间,a-z介于97-122之间。

所以,假设你只需要删除那些字符(没有强调),而不是其他语言的其他字符,例如,没有在ascii中表示,你需要做的就是循环字符串,验证每个字符是否是在这些值中删除它。