• ベストアンサー

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; }

noname#6117
noname#6117

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

  • ベストアンサー
  • mooncake
  • ベストアンサー率100% (6/6)
回答No.3

> char inputchar; > (省略) > cin >> inputchar; cinは右辺に設定した値の型に勝手に変換してくれるので、 この場合変数inputcharがchar型なので一文字入力です。 inputcharには一文字しかセットされないです。 疑問に思われているのは、一文字入力のはずなのに aやbを押した時に即座に処理されなくて[Enter]を 押した時にまとめて処理されるのは何故か? と言う事では ないでしょうか? そうなら・・・ 文字入力は正確には、キーボード→バッファ→cin と いう順に送られます。要するに cin >> inputchar; では [バッファ]から一文字取り出します。 ところがプロンプトで文字を押しても即座にはバッファに 送られないんですよ。改行([Enter])を押すと初めて 「まとめて」送られます。cin >> inputchar; ではそこから 一文字を持ってきて以降の処理を行ない、次回のcinでは バッファに残っている文字があればキー入力待ちにならずに バッファから一文字持ってきて勝手に処理を続けます。 なので押した文字が即変換されるように作ったつもりでも、 一文字押す→処理→一文字押す→処理…とならずに、 一文字押す→一文字押す→一文字押す→… [Enter]を押す→ 処理→処理→処理→ … という動作になってしまいます。 ちなみに一文字押す毎に直ちに処理を行ないたいのなら、 #include <conio.h>を追加して、cin >> inputchar; の行を、 inputchar = getche(); に変えるとうまくいきますよ。 外していたらすみません。

noname#6117
質問者

補足

いいえ、外してないです。言いたいことを上手く解釈してくださってありがとうございます。 良く解かりました。ありがとうございました。 皆様、有難うございました。

その他の回答 (2)

  • ara_ara
  • ベストアンサー率35% (124/348)
回答No.2

>cin >> inputchar; これはコンソールから1文字読み込んで変数inputcharにセットするということですが... どうお答えすればいいのでしょうか? http://www.stat.phys.kyushu-u.ac.jp/~ryokawa/cbegin2_3/html4/cbegin_c1_s6.html >outputchar=inputchar+'a'-'A'; これは、大文字を小文字に変換 >outputchar=inputchar-'a'+'A'; こちらは小文字を大文字に変換 尚、下記の条件式は →以降のように書く方がベターです。 >if(chrcode >=65 && chrcode<=90) → if(chrcode >='A' && chrcode<='Z') >if(chrcode >=97 && chrcode<=122) → if(chrcode >='a' && chrcode<='z')

noname#6117
質問者

補足

参考URLありがとうございました。 また、ソースのご指摘ありがとうございました。 数値に直す必要がるのかと思っていましたので、 参考にさせていただきます。 以後、もう一度「'A'」の意味をどこかで理解していきたいと思います。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>// cin >> -- ; というのは、 //どういうことでしょうか? 通常はキーボードから入力された文字が、inputchar という変数に代入されます。 「コンソール入力(in)」という意味になります。 逆の機能が、cout (コンソール出力(out))です。 ">>" の向きが逆ですよね。 Cの場合、input や printf という物が使われます。

noname#6117
質問者

お礼

大変有難うございました。 私の説明不足で申し訳ありませんでした。 次回、また質問することがありましたら よろしくお願いします。

noname#6117
質問者

補足

回答ありがとうございます。 補足させていただきますと、 私は、このソースは、最初は、 一文字づつしか出来ないと思っていたのですが、 エラー試しで、「Hello World」と入れたら 一文字づつ認識しているので、???となってしまいましたので、質問させていただきました。 教科書は、例題で身につけるC++・P32で、 質問のソースはその変形です。

関連するQ&A

  • VC++でプログラムの勉強をしています。

    プログラムは最近はじめたばかりです。While文とif文を使ってクイズを作ってみたところ、一個目のsinで入力を求めているところから無限ループになってしまいました。色々調べてcin.cler()とsin.ignore()を入れたりもしてみましたが上手くいきませんでした。どこを間違えているのでしょうか? //クイズ #include <iostream> using namespace std; int main()//cin.clear();cin.ignore();???? { int a; int b; while(1) { cout<<"ネコ型のロボットが出てくるアニメといえば?"<<endl; cout<<"A)ドラえもん B)ドラエもん C)ほりえもん D)サザエさん"<<endl; cin>>a; if(a=='A') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){break;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} if(b!='Y'||'N'){cout<<"正しく入力してね!"<<endl;} } if(a=='B'||'C'||'D') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){cout<<"残念!!"<<endl;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} } if(a!='A'||'B'||'C'||'D'){cout<<"正しく入力してね!"<<endl;} } cout<<"正解!!"<<endl; }

  • プログラムの動作

    10文字をスキップするプログラムなのですが、どのようにスキップしているのかわからないので教えてください。 下にソースコードを書きます。 #include <iostream> using namespace std; //10文字をスキップする istream &skipchar(istream &stream) { int i; char c; for(i=0; i<10; i++)stream >> c; return stream; } int main() { char str[80]; cout << "いくつかの文字を入力する:"; cin >> skipchar >> str; cout << str << endl; return 0; } よろしくおねがいします。

  • プログラムの動作の仕方

    この下のプログラムは、WRITE <ファイル名>をコマンド行で入力すると、動作するプログラムなのですが、この通りにWRITE <test>としてもできません。 やり方を教えてください. #include <iostream> #include <fstream> using namespace std; int main(int argc,char *argv[]) { if(argc!=2){ cout << "使い方:WRITE<ファイル名>" << endl; return 1; } ofstream out(argv[1]); //出力ファイル if(!out){ cout << "出力ファイルが開けません" << endl; return 1; } char str[80]; cout << "文字列をディスクに書き込み、$で停止します" << endl; do{ cout << ": "; cin >> str; out << str << endl; }while(*str!='$'); out.close(); return 0; } お願いします。

  • 配列の練習問題

    #include<iostream> using namespace std; //count関数の宣言 int count(char str[], char ch); int main() { char str[100]; char ch; cout << "文字列を入力して下さい。\n"; cin >> str; cout << "文字列から探す文字を入力して下さい。\n"; cin >> ch; int c = count(str, ch); cout << str << "の中に" << ch << "は" << c << "個あります。\n"; return 0; } //count関数の定義 int count(char str[], char ch) { int i = 0; int c = 0; while (str[i]) { if (str[i] == ch) c++; i++; } return c; } こんにちは。 この問題の解答のプログラムの意味がイマイチ解らないので良かったら教えて下さい。 確認がてらに質問します。 よろしくお願いします。

  • 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++

    今、下のようなプログラムを作っています #include <iostream> #include <iostream> using namespace std; int i=0, c=0, n; char str[10]; class X16karax10{ //16進から10進ヘ public: void keisan(); }; void X16karax10::keisan(void){ cout<<"16進を入力して下さい"<<endl; cout<<"英数字は大文字で入力してください(F→○ f→×)" <<endl; scanf("%s",str); while(str[i] != '\0'){ n = n * 0x10; c = str[i++]; if((c >= '0') && (c <= '9')){ n += c - '0'; } else if((c >= 'A') && (c <= 'F')){ n += c - 'A' + 10; } } cout<<("%d\n",n)<<"です\n"<<endl; } int main(){ for(i=0; ; i++){ X16karax10 p; p.keisan(); } } 16進を十進に変えるものなのですがreturn 0を使うと「X16karax10::keisan()' は値を返せない」と、でてしまうのですがどうしたらよいでしょうか?

  • javaプログラミング

    以下のプログラムがコンバイルできません なぜでしょうか? #include<iostream> #include<cmath> using namespace std; int main() { double a, b; cout << "実数 a の値を入力してください " << endl; cin >> a; cout << "実数 b の値を入力してください " << endl; cin >> b; cout << a << " の " << b << " 乗は " << pow(a, b) << "です" << endl; return 0; }

    • ベストアンサー
    • Java
  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

  • 改行文字について

    #include<iostream> using namespace std; int main(void) { char c; while (cin.get(c)) if (c == '\n') cout << "[RET]\n"; else cout << c; return(0); } これのif (c == '\n')の改行文字と等しいとは何のことを指すのでしょうか? よろしくお願いします。

  • char型配列について

    基本的なことですが、 char str[5]="Hello"; --> str[0]='H' str[1]='e' str[2]='l' str[3]='l' str[4]='o' str[5]='\0' では、ないのでしょうか? エラーが出ます。 //error C2117: 'str' : 指定された配列には、初期化子が多すぎます。 char str[6]="Hello"; では、コンパイルできます。 ---------------------------------- また、 #include<iostream> using namespace std; int main() { char str[6]="Hello"; cout << str << endl; for(int i=0;i<7;i++) { cout << "i=" << str[i]; if(str[i]=='\0'){cout << " NULL" << endl;} else{cout << endl;} } getchar();return 0; } ----------------------------------------------- とすると、 Hello i=H i=e i=l i=l i=o i= NULL <--ここで、NULLなら、 i=フ <--このぶんは、いらないと思うのですが、、、 となります。 str[6] i=6 は、何を意味するのでしょうか? Visual C++ NET を使用しています。 よろしくお願いします。