满足条件时跳转到下一个字符串

时间:2014-08-20 15:52:30

标签: c++ string

这是一个与过去的编码器检查问题之一相关的问题,称为HowEasy。

我们假设我们给出了一个句子,例如,

"We a1re really awe~~~some"

我只是想删除句子中不包含字母字符的每个单词,所以在上面的句子中,所需的输出将是

 "We really"

下面是我写的代码(不完整),当条件(字符串包含非字母表的字符)得到满足时,我不知道如何转到下一个字符串。你能否提出一些允许我这样做的修改或方法?

vect将是包含所需输出的字符串向量

string param;
cin>>param;

stringstream ss(param);
vector<string> vect;
string c;

while(ss >> c){

    for(int i=0; i < c.length(); i++){

        if(!(97<=int(c[i])&&int(c[i])<=122) &&
           !(65<=int(c[i])&&int(c[i])<=90)){

            //I want to jump onto next string once the above condition is met
           //and ignore string c;
        }
        vect.push_back(c);

        if (ss.peek() == ' '){
            ss.ignore();
        }
    }
}

3 个答案:

答案 0 :(得分:3)

如果您只想要一个标准库(c ++ 11)解决方案,请转到:

  • 使用std::istream_iterator来迭代字符串中的字词
  • 使用std::copy_if有条件地在您的向量中放置字词
  • 条件是使用std::find_if检查不存在非字母字符的lambda检查

<强>代码:

int main()
{
    std::string s = "We a1re really awe~~~some";
    std::istringstream str(s);
    std::vector<std::string> v;

    std::copy_if(
        std::istream_iterator<std::string>(str), 
        std::istream_iterator<std::string>(),
        std::back_inserter(v),
        [](const std::string& sp) { return std::find_if(std::begin(sp), std::end(sp), [](char c) { return !std::isalpha(c); } ) == std::end(sp); } 
        );

    for(auto& w : v)
       std::cout << w << "\n";    

    return 0;
}

输出

  

我们

     

确实


<强> Live demo

答案 1 :(得分:2)

创建一个新函数,检查整个字符串是否为字母。那你没有这个问题:

bool only_letters( std::string str )
{
    for( const char& c : str )
    {
       if( !std::isalpha( c ) )
           return false;
    }
    return true;
}

// ...
while( ss >> c )
{
     if( only_letters( c ) )
     {
         vect.push_back(c);
         if( ss.peek() == ' ' )
             ss.ignore();
     }
}

答案 2 :(得分:1)

这是一种处理它的严厉方式,但您可以使用algorithmcctype来实现您想要的效果。请注意,代码假定您确实需要输出We really,而不是将Wereally分别存储到向量中(尽管这会捕获空间。)代码可以修改通过删除find_space + 1std::isspace(c)来适应后者。

#include <iostream>
#include <algorithm>
#include <cctype>

int main()
{
    std::string s = "We a1re really awe~~~some";

    auto word_begin = s.begin();
    auto find_space = std::find(s.begin(), s.end(), ' ');
    std::string result = "";
    while (find_space != s.end())
    {
        std::string word(word_begin, find_space + 1);

        if (std::none_of(word.begin(), word.end(), 
             [](char c) { return !(std::isalpha(c) || std::isspace(c)); }))
        {
            result += word;
        }

        word_begin = find_space + 1;
        find_space = std::find(word_begin, s.end(), ' ');
    }
    std::cout << result;
    return 0;
}