• ベストアンサー

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

  • ループ中でのscanfおよびcin

    あまりに基礎的な質問ですが,ループ中の入力関数が期待する動作になりません. コードを載せます while (1) { int key; scanf("%d", &key); if (key == 1) break; } 期待する動作は1が入力されるまでループし続けるというものですが scanfは一度しか実行されずループし続けます,cinに変えても同様でした 何が原因か分かる方,ご教示ください

  • macのXcodeにおけるcinについて

    現在macOSXver10.4.11のXcode2.4.1を用いて C++言語の勉強をしています。 以下のソースをコンパイルしようとしてますが「std::cin >> str1;」の行で「error: no match for 'operator>>' in 'std::cin >> str1;'」と出てコンパイルに失敗します。 原因が分かる方がいればご教授願います。 #include <iostream> #include <stdio.h> int main (void) { char *str1[32], *str2[32]; std::cout << "何か入力して下さい ==>"; std::cin >> str1; std::cout << "あなたは" << str1 << "と入力しましたね。" << std::endl; printf("何か入力してください。==>"); scanf("%s",str2); printf("あなたは、%sと入力しましたね。\n",str2); return 0; } 初歩的な質問ですみませんがご回答の程よろしくお願い致します。

  • C++:cinが上手く使えない

     そもそもcinについてあまり詳しい事は知らないのですが よろしくおねがいします。  cinを使って整数を取りこもうとする時、数字以外が 入ってしまうとおかしな動作をします。  例えば「10未満の整数値を取りこむまで続くループ」で 入力部分を作ろうとした時に、 while(1){  cout << "入力してください" << endl;  cin >> int_a;  if(int_a < 10) break; } 大体 以上の様に書くと、入力する時にアルファベットが 入ってしまうと 入力して下さい 入力して下さい …(エンドレス)… 入力して下さい となってしまいます。cinをあきらめてscanfにしてみると 今度は実行時エラーがでてしまいます。  整数を入力する事が出来て、なおかつアルファベットが 入力されても' 'で囲った値が入るようにするには どのようにすればよいでしょうか?

  • C++のcin命令について

     私は、C++言語を勉強している初心者です。  ある日、C++言語では、   「cin >> a >> b >> c;」と書くと、プログラムを実行したときに、   「3 4 5」と入力すれば、変数aには 3 が、変数bには 4 が、変数cには 5 が代入されるということを知りました。  けど、今まで私がC言語を使う際に使っていた、   「scanf("%d,%d,%d",&a,&b,&c);」という文では、プログラムを実行したときに、   「3,4,5」と入力すれば、変数aには 3 が、変数bには 4 が、変数cには 5 が代入されるというように、3つの数字の間にカンマを入れて数を代入するというプログラムを作りたいのですが、どうやってもcin命令では再現できません。  超初心な質問ですが、わかる方がいらっしゃったら、やり方を教えてください。

  • Consoleアプリケーションの、「cin >>」について

    //一文字入力のつもりで、作ったのですが、 //「abcd」と打って、Enterすると、 //「a」→「A」 //「b」→「B」 //「c」→「C」 //「d」→「D」 //と、連続変換するのですが、 // cin >> -- ; というのは、 //どういうことでしょうか? // すみません、初心者です。 // よろしくお願いします。 #include <iostream> using namespace std; int main() { char inputchar; char outputchar; char Str1[12],Str2[12]; int chrcode; while(chrcode-120) { cin >> inputchar; chrcode = ( inputchar + inputchar ) / 2; if(chrcode >=65 && chrcode<=90) { outputchar=inputchar+'a'-'A'; strcpy(Str1,"大文字"); strcpy(Str2,"小文字"); } if(chrcode >=97 && chrcode<=122) { outputchar=inputchar-'a'+'A'; strcpy(Str1,"小文字"); strcpy(Str2,"大文字"); } cout << Str1 << "[" << inputchar << "]→" << Str2 << "[" << outputchar << "]" <<endl; } return 0; }

  • cin.get(c)について

    テキストを一文字読み込むときは、cin.get(c) と、やりますが、二文字ずつ読み込む方法が分かりません。 cin.read(pch,2)とやればいいという事らしいんですが、これもよく分かりません。 どなたか教えてください。

  • 文字を置き換える関数で分からないことがあります。

    文字列strの中にある、文字列bagと共通の文字を空白に置き換える関数とその動作を確認するための、空白に置き換えた文字列strを表示するプログラムですが、戻り値が正しくないそうです。 ヒントでもいいのでどう直せばいいのかどなたかお教え下さい。 #include <stdio.h> char str_space(char str[], char bag[]){ int a, b, c, d; for(a = 0; a <= 99; a++){ if(str[a] == '\0'){ c = a; break; } } for(a = 0; a <= 99; b++){ if(bag[a] == '\0'){ d = a; break; } } for(a = 0; a <= c; a++){ for(b = 0; b <= d; b++){ if(str[a] == bag[b]){ str[a] = ' '; } } } return str[]; } int main(void){ char str[100], bag[100]; scanf("%s", str); scanf("%s", bag); printf("%s", str_space(str, bag)); return 0; }

  • 構造体に決められた文字列を入れる方法

    構造体に文字列を入れたいのですがうまくいきません。 処理としては身長が180センチ以上の生徒には「tall」という文字列をつける、という処理です。 #include <stdio.h> #define NUM 4 typedef struct{ int b ;/*学生番号*/ int s ;/*身長*/ char k;/*結果*/ }Stdya; int main (void){ Stdya std[NUM]; char m [ ] = "tall"; int i; for(i=0;i<NUM;i++){ printf("学生番号"); scanf("%d",&std[i].b); printf("身長"); scanf("%d",&std[i].s); if(180<=std[i].s){ &std[i].k = m; } printf("%d\t%d\t%s\n",std[i].b,std[i].s,std[i].k); } return 0; } 20行目の処理が間違っているのはよくわかります どうすれば「tall」処理をできるか教えてください

  • 文字列中の空白部の読み込みの方法を教えてくださいm(_ _)m

    いつもお世話になっています!!キーボードから以下のような文字列を読み込み、大文字のみをカウントするプログラムを作りたいのですが、空白部になると次の文字を判定せずにプログラムが停止してしまいます。。。どなたかアドバイスをお願いしますm(_ _)m ○文字列 My name is Marly. ○プログラムソース #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void){ char *s; int i,j=0,m; s=(char*)malloc(sizeof(char)); printf("please iput sentens\n"); scanf("%s",s); m=strlen(s); for(i=0;i<m;i++){ if( 0x41 <= s[i] && s[i] <= 0x5A) j++; } printf("%d",j); free(s); return(0); }

  • 中央値をもとめる

    このプログラムだとたとえば 1、100、99を入力したときに間違った値を出します。どうすればいいでしょうか?おねがいします。 #include <stdio.h> int main(void) { int a, b, c, m; int max; printf("1個目の数値:"); scanf("%d", &a); printf("2個目の数値:"); scanf("%d", &b); printf("3個目の数値:"); scanf("%d", &c); max = a; if(max < b) max = b; if(max <= c) m = max; printf("%d, %d, %d の中央値は%dです。\n", a, b, c, m); }

専門家に質問してみよう