【问题标题】:C++ custom string trim implementation valgrind warningC++自定义字符串修剪实现valgrind警告
【发布时间】:2014-04-09 17:14:14
【问题描述】:

最近我实现了一个自定义函数来修剪 std::strings 删除空白字符前缀和后缀。

我测试了功能,它根据我的单元测试工作,但是当使用 valgrind 运行测试时,我得到以下输出:

==4486== Conditional jump or move depends on uninitialised value(s)
==4486==    at 0x415DDA: is_ws_char(char) (parse.cpp:22)
==4486==    by 0x415BC6: parse::trim(std::string&) (parse.cpp:34)

我输入的测试字符串是

string s("  a");

我看不出这里有什么问题。 代码如下所示:

inline bool is_ws_char(const char c) {    // this is line 22 in my code
  return (c == ' ' || c == '\n' || c == '\t' || c == '\r');
}


void parse::trim(std::string& str) {
  size_t len = str.size();
  size_t i = 0;
  for (; i < len; ++i)
    if (!is_ws_char(str[i]))
      break;
  const size_t start = i;
  for (i = len - 1; i >= 0; --i)
    if (!is_ws_char(str[i]))              // this is line 34 in my code
      break;
  const size_t end = i;
  str = str.substr(start, end - start + 1);
}

有人知道这里有什么问题吗? 我短暂地认为这只是 valgrind 的怪事,但这似乎不太可能。

提前致谢!

【问题讨论】:

  • 如果字符串只包含空格,看起来会失败。
  • 不,实际上它有效。我写了一个单元测试,其中包含几个像这样的极端案例。
  • 真的吗?我可能错了,但在我看来,如果你用一个只包含 2 个空格的字符串调用,你最终会得到 start=2。 end=0 然后调用我认为不会起作用的 str.substr(0,-1) 。但我可能错过了什么。
  • 嗯,你是对的。但它有效,即使在你建议的情况下。我完全不知道为什么。 :)

标签: c++ string valgrind trim


【解决方案1】:

这个循环无效

for (i = len - 1; i >= 0; --i)

条件将始终等于 true,因为表达式 --i 将始终 >= 0,因为 i 是无符号整数。

当 str.size() 等于 0 时,len - 1 将等于 std::string::npos。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多