通常、スペースを含む文字列を```cin```から入力しようとしても、スペースで勝手に入力が区切られてしまう。
#include <iostream> using namespace std; int main() { string str; cout << "半角スペースを含んだ1行をstrに入力:"; cin >> str; cout << str << endl; }
<実行結果>
半角スペースを含んだ1行をstrに入力:I'm adam.
I'm
そんな時は```getline(cin, 変数)```をつかって1行入力を行うとよい。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
cout << "文字列を入力:";
getline(std::cin, str);
cout << "入力は:" << str << endl;
return 0;
}
<実行結果>
文字列を入力:I'm madam.
入力は:I'm madam.
下のソースコードの```setw```などの様に、複数個所で同じような値を使って処理をする場面がプログラミングをしていると実によくあらわれる。
そんな時に、「あー、もうちょい表示幅減らすかー。」とか、変更したくなると、```setw```している場所全てを変更しなければならない。
そんな時は、1個変数を作って、その値をすべての場所で使うとよいのだが、表示幅などはプログラム中でしょっちゅう値が変化するような変数ではない。
このように、プログラム中で一定の値として使いたい変数は、変数ではなく定数として宣言するのが望ましい。
<定数の宣言の仕方>
基本的には普通の変数とほぼ同様であるが、```const 型 定数名 = 初期値;```のように宣言できる。
変数と異なる点としては、```const```が付くところと、必ず初期値がないとだめなところである。
const 型 定数名 = 初期値; //ex 整数定数 const int WINDOW_WIDTH = 600; //ex 実数定数 const float GRAVITY_CONSTANT = 9.80665; //ex 文字列定数 const string STR_WINDOW_NAME = "My Game Window";
それじゃ本題の、複数の型の混じったスペース区切りの1行入力
#include <iostream> #include <string> #include <iomanip> using namespace std; int main() { const int STRING_WIDTH = 9; const int INPUT_VAR_WIDTH = 5; string vStr; int vInt; float vReal; char vChar; cout << "データを以下のフォーマットで入力してください" << endl; cout << "文字列 整数 実数 文字:"; cin >> vStr >> vInt >> vReal >> vChar; cout << endl; cout << setw(STRING_WIDTH) << right << "文字列:" << setw(INPUT_VAR_WIDTH) << right << vStr << endl; cout << setw(STRING_WIDTH) << right << "整数:" << setw(INPUT_VAR_WIDTH) << right << vInt << endl; cout << setw(STRING_WIDTH) << right << "実数:" << setw(INPUT_VAR_WIDTH) << right << vReal << endl; cout << setw(STRING_WIDTH) << right << "文字:" << setw(INPUT_VAR_WIDTH) << right << vChar << endl; }
```setw```は授業でやった通り、上のソースコードのように使うと、```cout```の表示幅を設定することができる。
そのあとの```right```は```setw```の設定幅の中で、右寄せに表示する。と言う命令である。
(その他左寄せもあるけど、だいたいわかるよね!)
<実行結果>
データを以下のフォーマットで入力してください
文字列 整数 実数 文字:abcd 203 1.323 H
文字列: abcd
整数: 203
実数:1.323
文字: H