2011-03-24 117 views
8

我试着做了一个字符串迭代循环内的if语句,但无法弄清楚如何获得当前字符if语句:C++字符串迭代器

for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i) { 
    if (!isalpha(*i) && !isdigit(*i)) { 
     if(i != "-") { // obviously this is wrong 
      buffer.erase(i); 
     } 
    } 
} 

灿有人帮我获得当前角色,这样我可以做一些额外的if语句?

+0

你为什么标记该C? – GManNickG 2011-03-24 17:08:46

+0

你真的不需要isalpha和isdigit检查你是否要检查后面的特定字符 – AJG85 2011-03-24 17:17:59

回答

19

我无法弄清楚如何获得当前字符

你做在这里两次:

if (!isalpha(*i) && !isdigit(*i)) 

当你解引用一个迭代器(*i),你得到的元素它指出的。

"-" 

这是一个字符串文字,而不是字符。字符常量使用单引号,例如'-'

for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i) 

这将是非常简单的反向迭代器:

for (std::string::reverse_iterator i = buffer.rbegin(); i != buffer.rend(); ++i) 
+1

if((* i)!=' - '))如果您需要更多的澄清 – Pepe 2011-03-24 17:10:02

+0

@ P.R .:对'' - - ''很好的理解。 – 2011-03-24 17:11:12

+0

工作,谢谢! – Joe 2011-03-24 17:13:48

2

为了获得字符只是说*i,但这是远远不够的。你的循环是不合法的,因为它不允许在begin之前递减。您应该使用反向迭代器或remove_if算法。

1

你在上面的if声明的正上方:i是一个迭代器,所以*i给出了迭代器引用的字符。

请注意,如果您要向后遍历集合,通常使用reverse_iteratorrbeginrend更容易。我可能会使用预先打包的算法。

3
if(i != "-") 

应该

if(*i != '-') 
2

其他答案已经解决了,你有特别的问题,但你应该知道,有解决您最实际的问题不同的方法:即fullfill条件擦除元素。可与删除迎刃而解/擦除成语:

// C++0x enabled compiler 
str.erase( 
    std::remove_if(str.begin(), str.end(), 
        [](char ch) { return !isalpha(ch) && !isdigit(ch) && ch != '-' }), 
    str.end()); 

虽然这可能看起来很麻烦,首先,当你看到它了几次就不再是令人惊奇的,而且它是一个有效的从矢量或字符串中删除元素的方法。

如果你的编译器没有拉姆达支持,那么你可以创建一个仿函数,并把它作为第三个参数remove_if

// at namespace level, sadly c++03 does not allow you to use local classes in templates 
struct mycondition { 
    bool operator()(char ch) const { 
     return !isalpha(ch) && !isdigit(ch) && ch != '-'; 
    } 
}; 
// call: 
str.erase( 
    std::remove_if(str.begin(), str.end(), mycondition()), 
    str.end()); 
+0

不敢相信我是第一个赞成这个! :-) – 2016-12-14 09:23:25