所以我在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?
所以我在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?
#include <string>
#include <sstream>
static void cmd_test(const char *s)
{
std::istringstream iss(s);
std::string dummy;
int d = maxdepth;
iss >> dummy >> d;
}
什麼:
#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;
}
你真的不能提取到一個匿名的字符串,但你可以做一個假人,而忽略它:
#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);
}
也許從'爲const char *'爭論的一個'istringstream'的變化是一個有點沉重? –
用於提及錯誤處理。 – ildjarn
@ChristianRau:誰知道...... OP似乎是關於串流的案例,也許他已經有一個流淌在某個地方的流。如果你不喜歡,你可以從'const char *'構造一個。我添加了一條評論。 –