How to strip all non alphanumeric characters from a string in c++?

后端 未结 11 1328
野的像风
野的像风 2020-11-30 02:07

I am writing a piece of software, and It require me to handle data I get from a webpage with libcurl. When I get the data, for some reason it has extra line breaks in it. I

相关标签:
11条回答
  • 2020-11-30 02:24

    The remove_copy_if standard algorithm would be very appropriate for your case.

    0 讨论(0)
  • 2020-11-30 02:25

    Write a function that takes a char and returns true if you want to remove that character or false if you want to keep it:

    bool my_predicate(char c);
    

    Then use the std::remove_if algorithm to remove the unwanted characters from the string:

    std::string s = "my data";
    s.erase(std::remove_if(s.begin(), s.end(), my_predicate), s.end());
    

    Depending on your requirements, you may be able to use one of the Standard Library predicates, like std::isalnum, instead of writing your own predicate (you said you needed to match alphanumeric characters and spaces, so perhaps this doesn't exactly fit what you need).

    If you want to use the Standard Library std::isalnum function, you will need a cast to disambiguate between the std::isalnum function in the C Standard Library header <cctype> (which is the one you want to use) and the std::isalnum in the C++ Standard Library header <locale> (which is not the one you want to use, unless you want to perform locale-specific string processing):

    s.erase(std::remove_if(s.begin(), s.end(), (int(*)(int))std::isalnum), s.end());
    

    This works equally well with any of the sequence containers (including std::string, std::vector and std::deque). This idiom is commonly referred to as the "erase/remove" idiom. The std::remove_if algorithm will also work with ordinary arrays. The std::remove_if makes only a single pass over the sequence, so it has linear time complexity.

    0 讨论(0)
  • 2020-11-30 02:25
    #include <cctype>
    #include <string>
    #include <functional>
    
    std::string s = "Hello World!";
    s.erase(std::remove_if(s.begin(), s.end(),
        std::not1(std::ptr_fun(std::isalnum)), s.end()), s.end());
    std::cout << s << std::endl;
    

    Results in:

    "HelloWorld"
    

    You use isalnum to determine whether or not each character is alpha numeric, then use ptr_fun to pass the function to not1 which NOTs the returned value, leaving you with only the alphanumeric stuff you want.

    0 讨论(0)
  • 2020-11-30 02:28

    Below code should work just fine for given string s. It's utilizing <algorithm> and <locale> libraries.

    std::string s("He!!llo  Wo,@rld! 12 453");
    s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return !std::isalnum(c); }), s.end());
    
    0 讨论(0)
  • 2020-11-30 02:31

    Previous uses of std::isalnum won't compile with std::ptr_fun without passing the unary argument is requires, hence this solution with a lambda function should encapsulate the correct answer:

    s.erase(std::remove_if(s.begin(), s.end(), 
    []( auto const& c ) -> bool { return !std::isalnum(c); } ), s.end());
    
    0 讨论(0)
  • 2020-11-30 02:31

    You could always loop through and just erase all non alphanumeric characters if you're using string.

    #include <cctype>
    
    size_t i = 0;
    size_t len = str.length();
    while(i < len){
        if (!isalnum(str[i]) || str[i] == ' '){
            str.erase(i,1);
            len--;
        }else
            i++;
    }
    

    Someone better with the Standard Lib can probably do this without a loop.

    If you're using just a char buffer, you can loop through and if a character is not alphanumeric, shift all the characters after it backwards one (to overwrite the offending character):

    #include <cctype>
    
    size_t buflen = something;
    for (size_t i = 0; i < buflen; ++i)
        if (!isalnum(buf[i]) || buf[i] != ' ')
            memcpy(buf[i], buf[i + 1], --buflen - i);
    
    0 讨论(0)
提交回复
热议问题