编辑::std::string infix="2+2\0+2";
如何将它传递给函数 evaluate(std::string s){cout << s}
? => 2+2+2 ?
编辑 2::\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);
不发送完整数组:(
最佳答案
问题不在函数方面,而在调用者方面。要从包含空字节的字符串文字构造 std::string
,您需要使用其中一种重载来接收有关字符串大小的信息。
一个这样的重载 ( number 4 here ) 接收 char
指针和大小。由于字符串文字是 char
数组,您可以使用函数模板检索它们的大小:
template <std::size_t N>
std::string make_string(char const (&lit)[N]) {
return {lit, N};
}
...并因此使用它:
ASSERT_EQ(6, evaluate(make_string("2+2\0+2")));
您也可以使用相同的原则通过重载您的函数直接处理字符串文字:
template <std::size_t N>
auto evaluate(char const (&lit)[N]) {
return evaluate({lit, N});
}
关于c++:如何将原始字符串传递给类似 evaluate( "2+2\0+2") 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36449558/