【发布时间】:2013-01-02 15:48:04
【问题描述】:
这个问题可能非常简单,但我对 c++ 相当缺乏经验,并且在编写一个简单的解析器时被卡住了。 由于某种原因,其中一个字符串比较函数在调用时不会返回预期值。 函数如下所示:
template<int length>
bool Parser::compare(const char *begin, const char *str){
int i = 0;
while(i != length && compareCaseInsensitive(*begin, *str)){
i++;
begin++;
str++;
}
return i == length;
};
此函数的目的是比较运行时字符缓冲区和编译时常量字符串 vb
compare<4>(currentByte, "<!--");
我知道有更有效的方法来比较固定长度的字符缓冲区(并在以后使用),但是当我运行这个函数时我很困惑,它总是返回 false,即使是两个相同的字符串。
我检查了调试器,并在循环结束时检查了 i 的值,它等于模板参数的值,但返回表达式仍为 false。 关于使用 int 模板参数有什么特殊规则吗? 我假设模板参数的行为类似于编译时间常数。
我不知道这是否相关,但我正在运行 gcc 的 g++ 编译器并使用 gdb 进行调试。
如果有人能告诉我可能导致此问题的原因,我们将不胜感激。
这段代码中用到的函数:
template<typename Character>
Character toLowerCase(Character c){
return c > 64 && c < 91 ? c | 0x10 : c;
};
template<typename Character>
bool equalsCaseInsensitive(Character a, Character b){
return toLowerCase(a) == toLowerCase(b);
};
【问题讨论】:
-
一个版本调整为使用
==而不是compareCaseInsensitive()returns true 在这里给出相同的输入。 -
问题可能出在
compareCaseInsensitive。 -
我已经考虑过了,但是当我检查 i 变量时,它会评估为与长度相同的值。
-
您添加了
equalsCaseInsensitive的代码,但调用的是compareCaseInsensitive...这是对的吗? -
比较函数通常返回 -1、0 或 1,其中 0 是匹配项
标签: c++ templates string-comparison case-insensitive