【问题标题】:C++ integer template parameter evaluationC++ 整数模板参数评估
【发布时间】: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


【解决方案1】:

为了进行不区分大小写的字符串比较,我会尝试使用具有签名的标头 &lt;cstring&gt; 中的 STL 函数 std::strcoll

int strcoll( const char* lhs, const char* rhs );

并根据当前语言环境比较两个以 null 结尾的字节字符串。或者,如果您想自己滚动,您仍然可以使用带有签名的标题 &lt;cctype&gt; 中的 std::tolower

int tolower( int ch );

并根据当前安装的 C 语言环境定义的字符转换规则将给定字符转换为小写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2017-02-09
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多