我正在尝试查看正在读取的字符串的结尾是否为"
。如果不是,我希望它打印出来。
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.
答案 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
进行无效检查,但如果你喜欢防御性编程,那就是给定的。