find_last_of表示字符串末尾的双引号

时间:2012-09-13 23:34:36

标签: c++ string

我正在尝试查看正在读取的字符串的结尾是否为"。如果不是,我希望它打印出来。

if(!line.find_last_of("\"")) {
    cout << "Extra parameter is typed."; 
    continue;

我试图使用find_last_of,但是当我运行它时,无论命令是否有额外的参数,都会打印额外的参数。例如:

lc "file.txt"   -suppose to true so it's suppose to continue program but returns false
lc "file.txt" lk  - suppose to return false and it does but should only return false for this type of case.

3 个答案:

答案 0 :(得分:6)

虽然我认为@Jonathon Seng的答案很好(而且已经投了票),但我认为还有另一种可能值得一提的可能性。您可以使用mystring.at(mystring.length()-1)

而不是*mystring.rbegin()
if (*line.rbegin() == '"') ...

当然,您仍然需要检查字符串是否也为空。为此,我通常更喜欢!line.empty()而不是line.length() > 0,因此最终版本变为:

if (!line.empty() && *line.rbegin() == '"') {
    // whatever
}

修改:请注意,!line.empty()的测试必须是第一个。 &&计算其左操作数,然后if(且仅当)计算结果为true,计算其右操作数。我们需要验证该行是否为空 first ,然后仅在字符串不为空时才检查该字符。

答案 1 :(得分:2)

您可以将line.at(line.length() - 1)'"'进行比较(建立line.length() > 0后)。

答案 2 :(得分:0)

执行此操作的一种方法可能是

if( (!(line.find_last_of("\"") == line.length() - 1)) && (line.length() > 0) ) {
   <do your stuff>;
}

由于string :: find_last_of()返回给定字符的最后位置(如果在该行中的任何位置找到它(至少一次))。因此,如果它是倒数第二个字符,它将返回line.length() - 2,这将导致您的布尔表达式(if条件)的行为方式与最后一个字符相同。

检查line.length()是否大于零是必要的,如果line.length() == 0,这可能会返回true,因为string::find_last_of()返回string::npos(通常等于-1),如果它不能找到匹配的模式。

另外,不要忘记对line进行无效检查,但如果你喜欢防御性编程,那就是给定的。