隨着scanf的有,一般,採取格式的輸入的直接途徑:什麼是scanf格式輸入的cin analougus?
1)用實數高於0線,且小於1結束上的「x」,例如:0.32432523x
scanf("0.%[0-9]x", &number);
2)線表示在格式加法:30 + 28 = 58
scanf(":%d+%d=%99s", &number1, &number2, &total);
什麼是CIN溶液,只使用該支架ard圖書館?
隨着scanf的有,一般,採取格式的輸入的直接途徑:什麼是scanf格式輸入的cin analougus?
1)用實數高於0線,且小於1結束上的「x」,例如:0.32432523x
scanf("0.%[0-9]x", &number);
2)線表示在格式加法:30 + 28 = 58
scanf(":%d+%d=%99s", &number1, &number2, &total);
什麼是CIN溶液,只使用該支架ard圖書館?
使用>>操作符從cin讀取。
int number1, number2;
std::string text;
char plus, equals;
std::cin >> number1 >> plus >> number2 >> equals >> text;
if (!std::cin.fail() && plus == '+' && equals == '=' && !text.empty())
std::cout << "matched";
它不如scanf好,因爲您必須自己驗證scanf字符串中的任何文字。用stream來做它幾乎肯定會比scanf多得多的代碼行。
我會使用scanf。
使用'cin.fail()',而不是'cin.bad()'或直接使用'cin'作爲條件。 –
我已將它從bad()更改爲fail()。好決定。 – doug65536
你可以做一個簡單的類來驗證輸入。
struct confirm_input {
char const *str;
confirm_input(char const *in) : str(in) {}
friend std::istream &operator >>
(std::istream &s, confirm_input const &o) {
for (char const *p = o.str; * p; ++ p) {
if (std::isspace(* p)) {
std::istream::sentry k(s); // discard whitespace
} else if ((c = s.get()) != * p) {
s.setstate(std::ios::failbit); // stop extracting
}
}
return s;
}
};
用法:
std::cin >> x >> confirm_input(" = ") >> y;
非常好。這個想法非常靈活,你可以用這種方法解析對象。 – doug65536
無處* *附近漂亮...'scanf'真的很強大。就我個人而言,我讀入一個'string',通過'string :: c_str()'然後'sscanf'獲取指針。或者我從'stringstream'或者其他任何東西中自己記下它。 – paddy
對於C++中的格式化輸入,您可能需要考慮類似[Boost Spirit](http://boost-spirit.com/home/)。這可能是矯枉過正的,但它會比直接使用iostream更清潔。 –
scanf在這一次獲得勝利,因爲它同時給你一個返回值,你可以在一個地方檢查來驗證匹配的所有東西。在cin流中,你必須手動檢查一些東西。 – doug65536