閉じる

【C++】はじめてのcoutとcin:画面に表示&キーボード入力の基本

C++でプログラムを書きはじめると、最初に出会うのが標準入出力です。

画面にメッセージを表示したり、キーボードから値を入力したりできるようになると、一気に「プログラムを書いている」実感がわいてきます。

本記事ではcoutcinの基本から、初心者がつまずきやすいポイントまで、具体的なコードと図解で丁寧に解説します。

標準入出力とは?基本の考え方

標準入力(cin)と標準出力(cout)の役割

コンピュータのプログラムは、外からデータを受け取り(入力)、それを処理し、結果を外へ出す(出力)ことで役に立ちます。

C++ではこの役割を担う仕組みとして標準入力標準出力が用意されています。

  • 標準入力(standard input)
    通常は「キーボード」からの入力を意味します。C++ではcinというオブジェクトを使って扱います。
  • 標準出力(standard output)
    通常は「画面(コンソール画面)」への表示を意味します。C++ではcoutというオブジェクトを使います。

プログラムの立場から見ると、どこから来たか(キーボードか、ファイルかなど)をあまり気にせず「標準入力」から読み、「標準出力」に書くという考え方になっています。

このおかげで、後からリダイレクトやファイルとの接続がしやすくなりますが、初心者のうちは「キーボード = cin」「画面 = cout」と覚えておけば十分です。

C++で標準入出力を使う準備

C++でcoutcinを使うためには、いくつかの準備が必要です。

具体的には#includestd::という2つのポイントを押さえます。

iostreamヘッダをインクルードする

標準入出力に関する機能はiostreamというヘッダファイルに定義されています。

そのため、プログラムの先頭で次のように書きます。

C++
#include <iostream>  // cout, cin, endlなどを使うために必要

この1行を書くことで、コンパイラがcoutcinの定義を知ることができるようになります。

std名前空間とstd::cout, std::cin

標準ライブラリの多くの機能はstdという名前空間の中に定義されています。

標準入出力も同じで、本当の名前はstd::coutstd::cinです。

もっとも典型的な書き方は次の2通りです。

1つめはstd::を毎回付ける方法です。

C++
#include <iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;  // std::cout, std::endl を使用
    int x;
    std::cin >> x;  // std::cin を使用
    return 0;
}

2つめはusing namespace std;を使う方法です。

C++
#include <iostream>
using namespace std;  // std:: を省略できるようにする

int main() {
    cout << "Hello, world!" << endl;  // std:: を書かなくてよい
    int x;
    cin >> x;  // std:: を書かなくてよい
    return 0;
}

学習用の小さなプログラムではusing namespace std;を書いてしまってかまいません。

ただし大きめのプロジェクトではstd::を付ける書き方が推奨されることが多いと覚えておくとよいです。

coutの基本的な使い方

文字列を表示するcoutの書き方

画面に文字列を表示する最も基本的な方法がcoutです

書き方のポイントは<<という「挿入演算子」を使うことです。

C++
#include <iostream>
using namespace std;

int main() {
    // "こんにちは" という文字列を画面に表示する
    cout << "こんにちは" << endl;  // 行の終わりに改行も出力する
    return 0;
}
実行結果
こんにちは

この例では、"こんにちは"という文字列をcout<<で「挿入」しています。

挿入した順番どおりに画面に表示されると理解するとわかりやすいです。

文字列を複数並べたい場合も、<<でつなげるだけです。

C++
#include <iostream>
using namespace std;

int main() {
    cout << "Hello, " << "World!" << endl;  // 2つの文字列を連結して表示
    return 0;
}
実行結果
Hello, World!

変数の値をcoutで表示する方法

coutは文字列だけでなく、変数の値もそのまま表示できます。

数値や文字、文字列など、さまざまな型に対応しているため、デバッグにもとても便利です。

C++
#include <iostream>
using namespace std;

int main() {
    int age = 20;          // 整数の変数
    double height = 170.5; // 小数の変数

    // 文字列と変数を << でつなげて表示する
    cout << "年齢は " << age << " 歳です。" << endl;
    cout << "身長は " << height << " cmです。" << endl;

    return 0;
}
実行結果
年齢は 20 歳です。
身長は 170.5 cmです。

文字列と変数をそのままつなげて表示できるのが、C言語のprintfとの大きな違いです。

フォーマット指定を意識せずに書き始められるので、初心者にもわかりやすい仕組みになっています。

endlと改行コード(\n)の違い

行を区切るにはendl\nという2つの方法があります。

見た目はどちらも「そこで改行される」という点では同じですが、内部的な違いがあります。

endlとは何か

endl「改行を出力し、出力バッファをフラッシュする」という意味を持つ操作です。

C++
#include <iostream>
using namespace std;

int main() {
    cout << "1行目" << endl;  // 改行 + バッファのフラッシュ
    cout << "2行目" << endl;
    return 0;
}
実行結果
1行目
2行目

「バッファをフラッシュする」とは、一時的にためておいた出力内容を、すぐに画面へ流し込むことです。

通常はあまり意識しなくて構いませんが、大量にendlを使うと少しだけ処理が遅くなる可能性があります。

\n(バックスラッシュエヌ)とは何か

\n「改行文字を1つ出力するだけ」の特殊な文字です。

C++
#include <iostream>
using namespace std;

int main() {
    cout << "1行目\n";  // 改行文字を出力
    cout << "2行目\n";
    return 0;
}
実行結果
1行目
2行目

見た目の結果はendlと同じです。

ただし\nにはバッファをフラッシュする効果はありません

どちらを使えばよいか

初心者のうちはどちらを使っても問題ありません

ただし、次のように使い分けるとよいです。

  • 学習用・簡単なプログラム
    → 読みやすさを優先してendlを使ってもよい
  • 処理速度を意識したいとき、大量に出力するとき
    \nを使う
    (またはstd::endlを最小限にする)

結果は同じだが、内部的な挙動が少し違うという点だけおさえておけば十分です。

数値や文字のフォーマットと注意点

coutは型に応じて自動的に表示方法を選んでくれるため、基本的には深く意識しなくても使えます。

ただし、型ごとの挙動をざっくり知っておくと予期しない結果を避けられます。

C++
#include <iostream>
using namespace std;

int main() {
    int    a = 10;     // 整数
    double b = 3.14;   // 小数
    char   c = 'A';    // 1文字
    string s = "Hello"; // 文字列(C++標準ライブラリのstring型)

    cout << "整数 a: " << a << endl;
    cout << "小数 b: " << b << endl;
    cout << "文字 c: " << c << endl;
    cout << "文字列 s: " << s << endl;

    return 0;
}
実行結果
整数 a: 10
小数 b: 3.14
文字 c: A
文字列 s: Hello

ここでの注意点をいくつかまとめます。

  • charは1文字だけ
    char c = 'AB';のように2文字以上を入れるのは誤りです。必ず'A'のように1文字だけ、シングルクォートで囲みます。
  • 文字列にはstring型か”C言語スタイル文字列”
    C++ではstring型を使うのが一般的ですが、"Hello"のような配列タイプの文字列も扱えます。本記事では主にstringを使います。
  • 小数の桁数をそろえたいとき
    小数点以下の桁数を指定したい場合は#include <iomanip>fixed, setprecisionなどの操作子を使います。これは少し進んだ話題なので、必要になったときに調べれば大丈夫です。

cinの基本的な使い方

cinで整数や小数を読み込む基本

cin標準入力(通常はキーボード)から値を読み込むためのオブジェクトです。

基本の形はcin >> 変数;となります。

C++
#include <iostream>
using namespace std;

int main() {
    int x;  // 入力を受け取るための整数の変数を用意

    cout << "整数を1つ入力してください: ";
    cin >> x;  // キーボードから整数を読み込む

    cout << "入力された値は " << x << " です。" << endl;

    return 0;
}
実行結果
整数を1つ入力してください: 123
入力された値は 123 です。

ここでは「123」と入力してEnterキーを押したあと、その値が変数xに格納されるという流れになっています。

少数(実数)を読み込みたい場合も同じ書き方です。

C++
#include <iostream>
using namespace std;

int main() {
    double d;  // 少数を受け取る変数

    cout << "小数を1つ入力してください: ";
    cin >> d;

    cout << "入力された小数は " << d << " です。" << endl;

    return 0;
}
実行結果
小数を1つ入力してください: 3.14
入力された小数は 3.14 です。

型に合わない入力をするとエラー状態になるという重要な性質があります。

たとえばintに文字列を入れようとすると、cinが失敗して止まってしまいます。

この点は後ほど「初心者がつまずきやすいポイント」で詳しく解説します。

文字(char)や文字列(string)の入力方法

1文字だけ読みたいのか、複数文字の文字列を読みたいのかによって、使う型が変わります。

char型で1文字入力

C++
#include <iostream>
using namespace std;

int main() {
    char c;

    cout << "1文字入力してください: ";
    cin >> c;  // 空白や改行を区切りとして、1文字だけ読み込む

    cout << "入力された文字は '" << c << "' です。" << endl;

    return 0;
}
実行結果
1文字入力してください: A
入力された文字は 'A' です。

char型では1文字しか受け取れない点に注意してください。

複数文字を入力しても、最初の1文字だけがcに入り、残りは標準入力に残されます。

string型で単語(空白まで)を入力

C++
#include <iostream>
#include <string>  // string型を使うために必要
using namespace std;

int main() {
    string name;

    cout << "名前(苗字だけ)を入力してください: ";
    cin >> name;  // 空白や改行までの文字列を読み込む

    cout << "こんにちは、" << name << " さん。" << endl;

    return 0;
}
実行結果
名前(苗字だけ)を入力してください: 田中
こんにちは、田中 さん。

ここで重要な性質として、cin >> name;空白(スペースやタブ)を境目として読み込みを止めるという点があります。

そのため、次のような入力をすると途中で切れてしまいます。

実行結果
名前(苗字だけ)を入力してください: 田中 太郎
こんにちは、田中 さん。

苗字と名前の両方を1つのstringに入れたい場合はgetlineという別の関数を使う必要があります。

これについては後ほど詳しく説明します。

cinによる複数入力(スペース区切り)の扱い

cinは複数の変数への入力を1行でまとめて行うことができます

その際、入力は空白(スペースやタブ)、改行で区切られて処理されます。

C++
#include <iostream>
using namespace std;

int main() {
    int a, b, c;

    cout << "整数を3つ入力してください(例: 10 20 30): ";
    cin >> a >> b >> c;  // 3つの整数を連続して読み込む

    cout << "a = " << a << ", b = " << b << ", c = " << c << endl;

    return 0;
}
実行結果
整数を3つ入力してください(例: 10 20 30): 10 20 30
a = 10, b = 20, c = 30

この例では、「10 20 30」とスペース区切りで入力すると、それぞれa, b, cに順番に代入されます。

途中で改行してもかまいません。

実行結果
整数を3つ入力してください(例: 10 20 30): 10
20
30
a = 10, b = 20, c = 30

このように、空白文字は区切りとして扱われるだけで、特別な意味はないと理解しておくと、cinの動作がイメージしやすくなります。

cinと改行・空白の挙動を理解する

cinは数値や単語を読むとき、前後の空白や改行を自動的に読み飛ばします

この挙動を理解しておくと、「なぜここで止まるのか」「なぜここで勝手に進むのか」といった疑問が解消されます。

代表的な挙動は次の通りです。

  • 整数や小数、stringを読み込むとき
    先頭の空白・改行をスキップして、最初の空白までを1つの値として読み取ります。
  • charを読み込むとき
    デフォルトでは、整数などと同じように、空白や改行はスキップされます。つまりcin >> c;で空白や改行を読み取ることはできません。

この性質が問題になるのが、数値を読んだあとに行全体の文字列を読みたいというケースです。

C++
#include <iostream>
#include <string>
using namespace std;

int main() {
    int age;
    string line;

    cout << "年齢を入力してください: ";
    cin >> age;  // ここで「20 Enter」と入力したとする

    cout << "好きな食べ物を教えてください: ";
    getline(cin, line);  // ここでいきなり空行が読み取られることがある

    cout << "年齢: " << age << ", 好きな食べ物: " << line << endl;
    return 0;
}

このプログラムは意図したとおりに動かない可能性が高いです。

理由はcin >> age;のあとに、Enterによる改行文字が入力バッファに残っており、getlineがそれを「空の行」として受け取ってしまうためです。

このような問題を防ぐには、getlineを呼ぶ前にcin.ignore();などで残っている改行を捨てる必要があります。

この点は後半で詳しく説明します。

初心者がつまずきやすい標準入出力のポイント

cinが止まる・読み込めないときの原因

「cinが止まったまま動かない」「次の入力が読まれない」というトラブルは、初心者がよく体験する問題です。

その多くは型に合わない入力が原因です。

典型的な例

C++
#include <iostream>
using namespace std;

int main() {
    int x, y;

    cout << "整数を2つ入力してください: ";
    cin >> x >> y;  // ここで「10 abc」と入力してしまった場合

    cout << "x = " << x << ", y = " << y << endl;
    return 0;
}

このプログラムに対して次のように入力すると、2つめの読み込みが失敗します。

実行結果
整数を2つ入力してください: 10 abc
  • 1つ目のcin >> x;10を問題なく読み込みます。
  • 2つ目のcin >> y;整数を期待しているのに「abc」が来たため、読み込みに失敗してエラー状態になります。

その結果、

  • yの値は更新されない(元の不定値のまま、もしくは前の値のまま)
  • cinはエラー状態(fail状態)になり、その後の入力処理もすべて失敗する

という状態になります。

エラー状態の解除とバッファの掃除

実際のプログラムでは、cinが失敗したらエラー状態を解除し、間違った入力を捨てることがよく行われます。

C++
#include <iostream>
#include <limits> // numeric_limits を使うため
using namespace std;

int main() {
    int x;

    cout << "整数を入力してください: ";
    cin >> x;

    if (!cin) {  // cinがエラー状態かどうかをチェック
        cout << "整数として読み込めませんでした。" << endl;

        cin.clear();  // エラー状態を解除する
        // 残っている入力を行末まで捨てる
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        cout << "もう一度、整数を入力してください: ";
        cin >> x;
    }

    cout << "最終的に読み込まれた値は " << x << " です。" << endl;
    return 0;
}
実行結果
整数を入力してください: abc
整数として読み込めませんでした。
もう一度、整数を入力してください: 123
最終的に読み込まれた値は 123 です。

ここでは少し高度なテクニックも使っていますが、「cinが失敗すると、それ以降の入力処理はすべて失敗する」という点だけはしっかり覚えておくとよいです。

文字列入力でよくあるトラブル

文字列入力で特に多いトラブルが、getlinecin >>の組み合わせです。

数値入力のあとに行全体を読みたい

ユーザーに次のような対話をさせたくなることがあります。

  1. 年齢を数値で入力してもらう
  2. 自己紹介文を1行まるごと入力してもらう

これを素直に書くと次のようになりますが、期待通りには動きません

C++
#include <iostream>
#include <string>
using namespace std;

int main() {
    int age;
    string intro;

    cout << "年齢を入力してください: ";
    cin >> age;  // 例: 「20⏎」と入力

    cout << "自己紹介文を1行で入力してください: ";
    getline(cin, intro);  // ここで問題が起きやすい

    cout << "年齢: " << age << endl;
    cout << "自己紹介: " << intro << endl;

    return 0;
}

多くの場合、次のような結果になります。

実行結果
年齢を入力してください: 20
自己紹介文を1行で入力してください: 年齢: 20
自己紹介:

自己紹介文を入力する前に、プログラムが先へ進んでしまっていることがわかります。

理由は、先ほども触れたように「20⏎」の⏎(改行)が入力バッファに残っていて、それをgetlineが読んでしまうからです。

解決策: ignoreで改行を捨てる

この問題を解決するには、getlineを呼ぶ前に1文字(改行)を読み捨てるのが簡単です。

C++
#include <iostream>
#include <string>
using namespace std;

int main() {
    int age;
    string intro;

    cout << "年齢を入力してください: ";
    cin >> age;  // ここで「20⏎」を入力

    cin.ignore();  // 残っている改行文字('\n')を1文字捨てる

    cout << "自己紹介文を1行で入力してください: ";
    getline(cin, intro);  // ここで本物の1行を読み込める

    cout << "年齢: " << age << endl;
    cout << "自己紹介: " << intro << endl;

    return 0;
}
実行結果
年齢を入力してください: 20
自己紹介文を1行で入力してください: C++の勉強を始めました。
年齢: 20
自己紹介: C++の勉強を始めました。

「数値(や単語)をcinで読んだあとに、行全体を読みたいときは、getlineの前にcin.ignore()を挟む」というパターンは、標準入出力を扱ううえで定番のテクニックです。

標準入出力を使った簡単なサンプルプログラム

最後に、coutとcinを一通り使う練習になる簡単なサンプルプログラムを紹介します。

ここでは次のことを行います。

  1. 名前(フルネーム)を1行で入力してもらう
  2. 年齢と身長(cm)と体重(kg)を入力してもらう
  3. 来年の年齢とBMIを計算し、結果を表示する
C++
#include <iostream>
#include <string>
using namespace std;

int main() {
    string name;   // 名前(フルネーム)を格納するstring型の変数
    int age;       // 年齢(整数)
    double height; // 身長(cm)
    double weight; // 体重(kg)

    // 1. 名前を1行で入力してもらう(getlineを使用)
    cout << "あなたの名前をフルネームで入力してください: ";
    getline(cin, name);  // 空白を含む1行全体を読み込む

    // 2. 年齢と身長と体重を入力してもらう
    cout << "年齢を入力してください: ";
    cin >> age;

    cout << "身長(cm)を入力してください: ";
    cin >> height;

    cout << "体重(kg)を入力してください: ";
    cin >> weight;

    // 3. 来年の年齢とBMIを計算する
    int nextAge = age + 1;

    // 身長(cm)をmに変換してBMIを計算する
    double heightMeter = height / 100.0;
    double bmi = weight / (heightMeter * heightMeter);

    // 4. 結果を表示する
    cout << endl;  // 空行を1つ出力して見た目を整える
    cout << "===== 結果 =====" << endl;

    cout << "名前: " << name << endl;
    cout << "現在の年齢: " << age << " 歳" << endl;
    cout << "来年の年齢: " << nextAge << " 歳" << endl;

    cout << "身長: " << height << " cm" << endl;
    cout << "体重: " << weight << " kg" << endl;
    cout << "推定BMI: " << bmi << endl;

    return 0;
}
実行結果
あなたの名前をフルネームで入力してください: 山田 太郎
年齢を入力してください: 25
身長(cm)を入力してください: 170
体重(kg)を入力してください: 65

===== 結果 =====
名前: 山田 太郎
現在の年齢: 25 歳
来年の年齢: 26 歳
身長: 170 cm
体重: 65 kg
推定BMI: 22.4913

このプログラムでは、次のポイントが自然に練習できます。

  • coutでのメッセージ表示
  • cinによる整数・小数の入力
  • getlineによる1行の文字列入力
  • 複数の<<で文字列と変数を組み合わせて出力する

もしここまでの内容が少しでも理解できていれば、標準入出力の最初のハードルは十分に越えられています。

まとめ

標準入出力は、C++プログラミングの入り口でありながら、初心者が最初につまずきやすいポイントでもあります。

本記事ではcoutによる表示cinによる入力の基本から、endlと\nの違い空白・改行とgetlineの問題、さらにはcinのエラー状態までを、サンプルコードと図解のイメージを通して解説しました。

ここで紹介した典型的なパターン(数値入力、文字列入力、複数入力、ignoreの使い方)を自分の手で何度か試してみることで、標準入出力の挙動を体感的に理解できます。

まずは小さなプログラムを繰り返し書き、coutとcinを自然に使いこなせるようになることを目指してください。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!