首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++:如何将原始字符串传递给一个函数,比如计算( "2+2\0+2“)?

c++:如何将原始字符串传递给一个函数,比如计算( "2+2\0+2“)?
EN

Stack Overflow用户
提问于 2016-04-06 11:17:37
回答 3查看 1.3K关注 0票数 0

编辑::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);没有发送完整的数组时:(

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-06 11:34:02

问题不是在函数的一侧,而是在调用方。要从包含空字节的字符串文本构造一个std::string,您需要使用一个重载来获取有关字符串大小的信息。

其中一个重载(这里的4号)接收char指针和大小。由于字符串文本是char数组,所以可以使用函数模板检索它们的大小:

代码语言:javascript
复制
template <std::size_t N>
std::string make_string(char const (&lit)[N]) {
    return {lit, N};
}

..。然后用它:

代码语言:javascript
复制
ASSERT_EQ(6, evaluate(make_string("2+2\0+2")));

还可以通过重载函数直接使用相同的原则来处理字符串文本:

代码语言:javascript
复制
template <std::size_t N>
auto evaluate(char const (&lit)[N]) {
    return evaluate({lit, N});
}
票数 3
EN

Stack Overflow用户

发布于 2016-04-06 11:28:05

当const cstr[] = "2+/0+2";计算(Cstr);不发送完整数组时:(

您可以使用std:string的构造函数,它接受迭代器范围,例如:

代码语言:javascript
复制
// 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")))
}
票数 0
EN

Stack Overflow用户

发布于 2016-04-06 11:39:09

我的猜测是,您不是要测试"2 +2 null_byte + 2",而是要测试"2 +2除以0+ 2“。

如果是这样的话,请记住,在C++字符串文本中,您需要输入一个双反斜杠(因为反斜杠被用作许多不可输入字符的转义字符)。

试一试

代码语言:javascript
复制
ASSERT_EQ(6, evaluate("2+2\\0+2"))

或者,因为您使用的是C++11

代码语言:javascript
复制
ASSERT_EQ(6, evaluate(R"2+2\0+2"))

使用“原始”字符串文字

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36449558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档