2011-10-27 82 views
3

所以我在C中寫了這個,所以sscanf在s中掃描,然後丟棄它,然後掃描d並存儲它。因此,如果輸入是「Hello 007」,則掃描但是丟棄Hello,並將007存儲在d中。C++ cin與C sscanf

static void cmd_test(const char *s) 
{ 
    int d = maxdepth; 
    sscanf(s, "%*s%d", &d); 
} 

所以,我的問題是我怎麼能做同樣的事情,但在C + +?可能使用stringstream?

回答

5
#include <string> 
#include <sstream> 

static void cmd_test(const char *s) 
{ 
    std::istringstream iss(s); 
    std::string dummy; 
    int d = maxdepth; 
    iss >> dummy >> d; 
} 
1

什麼:

#include <string> 
#include <sstream> 

static void cmd_test(const std::string &s) 
{ 
    int d = maxdepth; 
    std::string dont_care; 
    std::istringstream in(s); 
    in >> dont_care >> d; 
} 
3

你真的不能提取到一個匿名的字符串,但你可以做一個假人,而忽略它:

#include <string> 
#include <istream> 
// #include <sstream> // see below 

void cmd_test(std::istream & iss) // any std::istream will do! 
{ 

    // alternatively, pass a `const char * str` as the argument, 
    // change the above header inclusion, and declare: 
    // std::istringstream iss(str); 

    int d; 
    std::string s; 

    if (!(iss >> s >> d)) { /* maybe handle error */ } 

    // now `d` holds your value if the above succeeded 
} 

注意,提取可能會失敗,從哪裏投放條件。這取決於你在錯誤情況下做什麼。 C++要做的事情是拋出一個異常(儘管如果你的實際函數已經傳遞了錯誤,你可能只能得到return一個錯誤)。

用法示例:

#include <iostream> 
#include <fstream> 

int main() 
{ 
    cmd_test(std::cin); 

    std::ifstream infile("myfile.txt"); 
    cmd_test(infile); 

    std::string s = get_string_from_user(); 
    std::istringstream iss(s); 
    cmd_test(iss); 
} 
+0

也許從'爲const char *'爭論的一個'istringstream'的變化是一個有點沉重? –

+0

用於提及錯誤處理。 – ildjarn

+0

@ChristianRau:誰知道...... OP似乎是關於串流的案例,也許他已經有一個流淌在某個地方的流。如果你不喜歡,你可以從'const char *'構造一個。我添加了一條評論。 –