我想「提取」的名稱和下一個整數。當我運行這個時,我得到一個運行時錯誤。我已經測試沒有字符串,它運行良好。C++麻煩sscanf模式
// Test string
std::string show = "BlahBlah 3";
// Pickup string and int
std::string nameString;
int id;
sscanf(show.c_str(), "%s %i", &nameString, &id);
我在做什麼錯?
我想「提取」的名稱和下一個整數。當我運行這個時,我得到一個運行時錯誤。我已經測試沒有字符串,它運行良好。C++麻煩sscanf模式
// Test string
std::string show = "BlahBlah 3";
// Pickup string and int
std::string nameString;
int id;
sscanf(show.c_str(), "%s %i", &nameString, &id);
我在做什麼錯?
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...
}
那麼,你做錯了什麼是sscanf()
,一個C庫函數,std::string
,一個C++類。 sscanf()
對C++類沒有任何瞭解。 sscanf()
早在C++僅僅是Stroustrup眼中的一絲閃爍之前就存在了......
得到它,理解我謝謝。 +1並回答。 –
@Galik當時,我的意思是'reserve()'。我預先分配了字符串的容量,而不是它的大小,然後讓'sscanf()填充內存,然後最終將大小設置爲讀取的字符數。但我想調整大小會擦除讀取的字符,所以使用'resize()'而不是'reserve()'進行預分配會更有意義。 –