C++遇到sscanf模式的问题

Eva*_*ake -1 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);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Rem*_*eau 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...
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以预先分配std::stringsscanf()填写它:

// 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...
}
Run Code Online (Sandbox Code Playgroud)

由于您使用的是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...
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*hik 6

那么,你做错了就是使用sscanf()一个C库函数std::string,一个C++类.sscanf()对C++类一无所知.sscanf()早在C++只是Stroustrup眼中的微光之前就存在了......