• ベストアンサー

cinの区切り文字の書き方

Cで、 int h, m, s; scanf("d:%d:%d", &h, &m, &s); をC++ のcinを使って書きたいのですが、区切り文字の「:」の書き方が調べているのですがよく分かりません。 御経験のある方、御教示願えればと思います。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> C++らしい書き方では、cinのdeliminatorであるブランクやTABキ―に、演算子のオーバーロードの > 機能を使って、「:」を追加すような方法もあるのかな?と思っていますが、 > こちらの書き方はよく分かりません。 指定したフォーマットをきちんと守ってほしいなら正規表現使うでしょね。 #include <regex> #include <string> #include <iostream> #include <sstream> using namespace std; int string2int(const string& str) { int result; istringstream(str) >> result; return result; } int main() { regex re("([0-9]+) ([0-9][0-9]?):([0-9][0-9]?)"); smatch results; string line; bool ok = false; while ( !ok ) { getline(cin, line); ok = regex_match(line, results, re); if ( !ok ) cout << "bad format!!" << endl; } int h = string2int(results[1]); int m = string2int(results[2]); int s = string2int(results[3]); cout << h << ' ' << m << ':' << s << endl; }

tmiyoshi
質問者

お礼

御回答ありがとうございます。 C++での正規表現の使い方、istringstream()での文字列型からint型への 変換などとても参考になりました。 ありがとうございました。

その他の回答 (1)

回答No.1

ignore() を使って指定した文字数あるいは特定の文字が現れるまで読み飛ばすことができますが、それでよいかしら。

tmiyoshi
質問者

補足

検索していたら、同じような質問をされている方がいて、 int h, m, s; char delim; cin >> h >> delim >> m >> delim >> s; というのがありました。 もう少し、正確な入力を求めるなら、 int h, m, s; char delim; do { cout << "開始時刻を時:分:秒で入力してください: "; cin >> h >> delim >> m >> delim >> s; } while(delim != ':'); C++らしい書き方では、 cinのdeliminatorであるブランクやTABキ―に、演算子のオーバーロードの機能を使って、「:」を追加すような方法もあるのかな?と思っていますが、こちらの書き方はよく分かりません。御存知の方がいられれば是非教えてください。

関連するQ&A

専門家に質問してみよう