这是一个与过去的编码器检查问题之一相关的问题,称为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();
}
}
}
答案 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)
这是一种处理它的严厉方式,但您可以使用algorithm
和cctype
来实现您想要的效果。请注意,代码假定您确实需要输出We really
,而不是将We
和really
分别存储到向量中(尽管这会捕获空间。)代码可以修改通过删除find_space + 1
和std::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;
}