1

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

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.
4

3 回答 3

6

虽然我认为@Jonathon Seng 的回答很好(并且已经投票赞成),但我认为还有另一种可能值得一提。而不是mystring.at(mystring.length()-1),您可以使用*mystring.rbegin()

if (*line.rbegin() == '"') ...

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

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

编辑:请注意,!line.empty()必须首先进行测试。&&计算其左操作数,然后当(且仅当)其计算结果为 时true,计算其右操作数。我们需要先验证该行不为空,然后仅在字符串不为空时检查字符。

于 2012-09-14T00:05:22.723 回答
2

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

于 2012-09-13T23:36:35.100 回答
0

一种方法可能是

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

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

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

也不要忘记空检查line,但如果你喜欢防御性编程,这是给定的。

于 2012-09-13T23:41:40.190 回答