编辑::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);没有发送完整的数组时:(
发布于 2016-04-06 11:34:02
问题不是在函数的一侧,而是在调用方。要从包含空字节的字符串文本构造一个std::string,您需要使用一个重载来获取有关字符串大小的信息。
其中一个重载(这里的4号)接收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});
}发布于 2016-04-06 11:28:05
当const cstr[] = "2+/0+2";计算(Cstr);不发送完整数组时:(
您可以使用std:string的构造函数,它接受迭代器范围,例如:
// Using macro
#define ARR_TO_STR(a) std::string(std::cbegin(a), std::cend(a))
// And template function
template <typename T, size_t N>
std::string ArrToStr( T (&t)[N] ) {
return std::string(std::cbegin(t), std::cend(t));
}
int main()
{
ASSERT_EQ(6, evaluate(ArrToStr("2+\0+2")))
}发布于 2016-04-06 11:39:09
我的猜测是,您不是要测试"2 +2 null_byte + 2",而是要测试"2 +2除以0+ 2“。
如果是这样的话,请记住,在C++字符串文本中,您需要输入一个双反斜杠(因为反斜杠被用作许多不可输入字符的转义字符)。
试一试
ASSERT_EQ(6, evaluate("2+2\\0+2"))或者,因为您使用的是C++11
ASSERT_EQ(6, evaluate(R"2+2\0+2"))使用“原始”字符串文字
https://stackoverflow.com/questions/36449558
复制相似问题