2016-04-05 67 views
-1

我想「提取」的名稱和下一個整數。當我運行這個時,我得到一個運行時錯誤。我已經測試沒有字符串,它運行良好。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); 

我在做什麼錯?

回答

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... 
} 
+0

得到它,理解我謝謝。 +1並回答。 –

+1

@Galik當時,我的意思是'reserve()'。我預先分配了字符串的容量,而不是它的大小,然後讓'sscanf()填充內存,然後最終將大小設置爲讀取的字符數。但我想調整大小會擦除讀取的字符,所以使用'resize()'而不是'reserve()'進行預分配會更有意義。 –

6

那麼,你做錯了什麼是sscanf(),一個C庫函數,std::string,一個C++類。 sscanf()對C++類沒有任何瞭解。 sscanf()早在C++僅僅是Stroustrup眼中的一絲閃爍之前就存在了......