【发布时间】: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) 。但我可能错过了什么。
-
嗯,你是对的。但它有效,即使在你建议的情况下。我完全不知道为什么。 :)