C ++遇到sscanf模式的问题

时间:2016-04-05 01:20:48

标签: c++ scanf

我试图“提取”名称和下一个整数。当我运行它时,我得到一个运行时错误。我已经测试了没有字符串,它运行正常。

// Test string
std::string show = "BlahBlah 3";

// Pickup string and int
std::string nameString;
int id;
sscanf(show.c_str(), "%s %i", &nameString, &id);

我做错了什么?

2 个答案:

答案 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() ......