【发布时间】:2016-07-26 18:19:14
【问题描述】:
编辑::std::string infix="2+2\0+2"; 如何将其传递给函数evaluate(std::string s){cout << s}? => 2+2+2 ?
EDIT2:: \0 是一个NULL 字符;我的语法检查函数从字符串中读取每个字符,如果它不同于数字或运算符,则会引发异常。我想读取空字符并引发异常,但evaluate("2+2\0+2") 返回4。
我正在用 c++11 编写一个带有测试的简单计算器,支持中缀表示法。
我有一个函数int evaluate( const std::string & infix ),它根据我的字符串计算结果(即evaluate( "((-3+--4*-(-19+5)))" ) 返回53)。一切正常,直到...
当我创建一些测试时,我可以写ASSERT_EQ(6, evaluate("2+2+2"))。但是当我写ASSERT_EQ(6, evaluate("2+2\0+2") 时,一切都出错了(这应该抛出一个exception,但它返回4)。
那么如何将一个字符数组传递给一个函数,而不知道它的大小并且其中包含空字符?当const char cstr[] = "2+\0+2"; evaluate(cstr); 没有发送完整的数组时:(
【问题讨论】:
-
字符串文字中不能有空字节。 C++ 不知道数组的长度 (
char[]),所以它假设它以\0结尾。 -
正是这个问题!那么当你有一个像
evaluate( std::string or any other const*char )这样的公共函数并且有人想写一个像ASSERT_..(evaluate( "\0" ))这样的测试时如何保护自己?? -
@Zereges 这是错误的。您可以在字符串文字中很好地包含空字节,并且数组的大小是其类型的一部分。
std::string只是没有模板构造函数可以直接取入数组,所以要小心一点。
标签: c++ string templates c++11 null