如何用空格

时间:2016-02-18 18:04:17

标签: c++ string stl

我对C ++中的STL很新,即使在几小时后也无法获得正确的输出。

int main()
{
    std::string str = "Hello8$World";
    replace(str.begin(), str.end(), ::isdigit, " ");
    replace(str.begin(), str.end(), ::ispunct, " ");
    return 0;
}

如果上述方法有效,我会非常高兴,但事实并非如此。

4 个答案:

答案 0 :(得分:3)

使用 lambda函数的所有内容,更多 C ++ 14 -ish:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string str = "Hello8$World";

    std::replace_if(str.begin(), str.end(), [](auto ch) {
        return ::isdigit(ch) || ::ispunct(ch);
    }, ' ');

    std::cout << str << std::endl;
    return 0;
}

这样你就不会在字符串上迭代两次。

答案 1 :(得分:1)

您使用的功能错误。 std::replace为两个迭代器提供旧值和新值。 std::replace_if为两个迭代器提供一个函数和一个新值。您还需要使用' '而不是" "作为迭代器指向的字符串类型是char而不是字符串。如果将其更改为

replace_if(str.begin(),str.end(),::isdigit,' ');
replace_if(str.begin(),str.end(),::ispunct,' ');

一切正常(Live Example)。

答案 2 :(得分:1)

在这种情况下,您需要使用replace_if函数,因为您正在检查条件。 Cppreference对此有一个很好的解释。 replace_if的最后两个参数是UnaryPredicate(一个接受一个参数并返回truefalse的函数)和迭代器中每个位置的基础对象类型(用于字符串)是char,而不是字符串。)

int main()
{
    std::string str="Hello8$World";
    std::cout << str << std::endl;
    std::replace_if(str.begin(), str.end(), ::isdigit, ' ');
    std::replace_if(str.begin(), str.end(), ::ispunct, ' ');
    std::cout << str << std::endl;
    return 0;
}

答案 3 :(得分:1)

使用谓词的函数名称为std::replace_if,您想要替换字符,因此' '而不是" " - 这是char const*

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string str = "Hello8$World";
    std::replace_if(str.begin(), str.end(), ::isdigit, ' ');
    std::replace_if(str.begin(), str.end(), ::ispunct, ' ');
    std::cout << str << std::endl;
    return 0;
}