C++ 从堆栈读取 char 到字符串结果 "Unrecognized enum"
C++ reading char from stack to string results in "Unrecognized enum"
我是 C++ 的新手,一定有我遗漏的东西。我的代码是这样的:
std::stack<char> operators;
std::stringstream stream;
stream.str("5.2 + 3");
while(stream.peek() != -1){
char token = static_cast<char>(stream.get());
//some code checking if the token is valid
operators.push(token);
auto tmp = operators.top(); //there I can still see the char (for example '+')
std::string tmpStr = "" + tmp; //But when put into string, there is "Unrecognized enum"
}
变量tmpStr填充"Unrecognized enum"而不是tmp.
的内容
我找不到任何解决方案,但我相信它一定很简单。
感谢您的帮助。
编辑:
因此,如果我使用 tmpStr.push_back(tmp) 它会起作用。但后来我这样使用它:
std::queue<std::string> outQueue;
outQueue.push(" " + operators.top());
//some code
std::string result = "";
while(!outQueue.empty()){
result.append(outQueue.front() + " ");
outQueue.pop();
}
//result then has for example something like "5.2 own enum 3 own enum"
在 operators 堆栈附加的位置上,有 "own enum" 而不是实际保存在那里的内容。
停止"" + something
!
这是 C++,它不会神奇地从字符串文字中生成字符串对象。
如果上面的代码实际编译,这意味着 somethign
是某种整数类型,你正在获取 "" 指向的位置的堆栈指针 (const char*) 并添加指针偏移量到那个。在下一个 NULL 之前,您不会读取一些 随机数据 。
如果您想将某些内容转换为字符串,您需要对其进行转换。标准方法是通过输出流运算符。
enum OP
{
OP_ADD,
OP_SUB,
OP_DIV,
OP_MUL
};
std::ostream& operator << (std::ostream& os, OP op)
{
switch (op)
{
case OP_ADD:
os << "ADD";
break;
case OP_SUB:
os << "SUB";
break;
case OP_DIV:
os << "DIV";
break;
case OP_MUL:
os << "MUL";
break;
default:
throw std::logic_error("Invalid OP");
}
}
然后可以这样使用:
OP op = OP_ADD;
std::stringstream buff;
buff << op;
std::string sop = buff.str();
但由于上面的代码很愚蠢,我有一个 shorthand 用于对象到字符串的转换:
template <typename T>
std::string to_string(T value)
{
std::stringstream buff;
buff << value;
return buff.str();
}
然后可以这样使用:
OP op = OP_ADD;
std::string sop = to_string(op);
我是 C++ 的新手,一定有我遗漏的东西。我的代码是这样的:
std::stack<char> operators;
std::stringstream stream;
stream.str("5.2 + 3");
while(stream.peek() != -1){
char token = static_cast<char>(stream.get());
//some code checking if the token is valid
operators.push(token);
auto tmp = operators.top(); //there I can still see the char (for example '+')
std::string tmpStr = "" + tmp; //But when put into string, there is "Unrecognized enum"
}
变量tmpStr填充"Unrecognized enum"而不是tmp.
的内容我找不到任何解决方案,但我相信它一定很简单。 感谢您的帮助。
编辑: 因此,如果我使用 tmpStr.push_back(tmp) 它会起作用。但后来我这样使用它:
std::queue<std::string> outQueue;
outQueue.push(" " + operators.top());
//some code
std::string result = "";
while(!outQueue.empty()){
result.append(outQueue.front() + " ");
outQueue.pop();
}
//result then has for example something like "5.2 own enum 3 own enum"
在 operators 堆栈附加的位置上,有 "own enum" 而不是实际保存在那里的内容。
停止"" + something
!
这是 C++,它不会神奇地从字符串文字中生成字符串对象。
如果上面的代码实际编译,这意味着 somethign
是某种整数类型,你正在获取 "" 指向的位置的堆栈指针 (const char*) 并添加指针偏移量到那个。在下一个 NULL 之前,您不会读取一些 随机数据 。
如果您想将某些内容转换为字符串,您需要对其进行转换。标准方法是通过输出流运算符。
enum OP
{
OP_ADD,
OP_SUB,
OP_DIV,
OP_MUL
};
std::ostream& operator << (std::ostream& os, OP op)
{
switch (op)
{
case OP_ADD:
os << "ADD";
break;
case OP_SUB:
os << "SUB";
break;
case OP_DIV:
os << "DIV";
break;
case OP_MUL:
os << "MUL";
break;
default:
throw std::logic_error("Invalid OP");
}
}
然后可以这样使用:
OP op = OP_ADD;
std::stringstream buff;
buff << op;
std::string sop = buff.str();
但由于上面的代码很愚蠢,我有一个 shorthand 用于对象到字符串的转换:
template <typename T>
std::string to_string(T value)
{
std::stringstream buff;
buff << value;
return buff.str();
}
然后可以这样使用:
OP op = OP_ADD;
std::string sop = to_string(op);