我试图“提取”名称和下一个整数。当我运行它时,我得到一个运行时错误。我已经测试了没有字符串,它运行正常。
// Test string
std::string show = "BlahBlah 3";
// Pickup string and int
std::string nameString;
int id;
sscanf(show.c_str(), "%s %i", &nameString, &id);
我做错了什么?
答案 0 :(得分:8)
sscanf()
是C函数,而不是C ++函数。它没有std::string
的概念。您无法使用sscanf()
读取std::string
变量,就像您尝试过的那样。您需要为char
预先分配一个sscanf()
缓冲区,然后将其分配给您的std::string
,例如:
// Test string
std::string show = "BlahBlah 3";
// Pickup string and int
std::string nameString;
char buffer[32];
int id;
if (sscanf(show.c_str(), "%.31s %i", buffer, &id) == 2)
{
nameString = buffer;
// use values as needed...
}
else
{
// values not parsed...
}
或者,您可以预先分配std::string
并填写sscanf()
:
// Test string
std::string show = "BlahBlah 3";
// Pickup string and int
std::string nameString;
int id;
nameString.resize(32);
if (sscanf(show.c_str(), "%.31s %i", &nameString[0], &id) == 2)
{
nameString.resize(std::strlen(nameString.c_str()));
// use values as needed...
}
else
{
// values not parsed...
}
由于您使用的是C ++,更好的选择是使用C ++类来解析字符串,例如:
// Test string
std::string show = "BlahBlah 3";
// Pickup string and int
std::string nameString;
int id;
std::istringstream iss(show);
if (iss >> nameString >> id)
{
// use values as needed...
}
else
{
// values not parsed...
}
答案 1 :(得分:6)
嗯,你做错了的是使用sscanf()
,一个C库函数,std::string
,一个C ++类。 sscanf()
对C ++类一无所知。早在C ++只是Stroustrup眼中的微光之前很久就存在sscanf()
......