【C++】入力 / Input

【C++】
入力 / Input










入出力とは


入力とは

入力とは、簡単に言えば、キーボードからの情報を取得すること。
キーボードは、「標準入力」と呼ばれ、PCへ情報を入力するツール。
「C++」では、「標準入力」からの文字列情報を「cin」コマンドで取得する。


出力とは

出力とは、簡単に言えば、モニターに、文字や数字を表示することをいう。
モニターだけでなく、ファイルに結果を保存することも「出力」という。
「標準出力」とは、モニターなどのことを言い、出力する機器のことをいう。

出力に使われるコマンドは、「cout」コマンドなどがある。
「cout」コマンドは、変数などの中身や、文字・数字を確認するためにも使われ、
プログラムコードを記述するのに必須のコマンド。


入力コマンド

・cin


出力コマンド

・printf
・puts
・cout
・cerr


Back



入力コマンド「cin」の使い方


「cin」コマンドは、文字列を入力・取得し、変数に格納するコマンド。


書式
cin >> 格納する変数


サンプルコード
#include <iostream>
#include <string>
using namespace std;

int main()
{
string name;
cout << "こんにちは。私はコンピュータです。" <<endl;
cout << "あなたの名前を入力してください。" <<endl;
cin >> name;
cout<<name<<"さん。よろしく。"<<endl;
std::cin.ignore(1000);
}


int Inum;
std::cout<<"数値を入力してください。";
if(!std::cin.fail()){
std::cout<<"入力した数値="<<Inum<<std::endl;
}else{
std::cout<<"数値のみ入力可能です。"<<std::endl;
}
std::cin.ignore(1000);


「std::cin.fail()」は入力が失敗した場合TRUEを返す。
「std::cin.good()」でも、入力エラーが確認できる。

「std::cin」内部では、エラー値を記録していて、前回のエラーの値が残っている可能性がある。
2回以上間違えた場合の対応策は、
「std::cin.clear();」= エラーをリセット
「std::cin.seekg(0);」=cinストリームの入力バッファを先頭に移動。
をすることで、「std::cin」のエラー値をリセットすることができる。

「std::cin.ignore()」は、
「std::cin」内部のバッファーをクリアしてくれる。
引数を指定しなかった場合1文字分しか除去してくれないので、最大数(10000文字)を指定する。



Back


出力コマンド「cout」の使い方


「cout」コマンドは、出力するためのコマンド。

一緒に使われるコマンド
endl改行


書式
std::cout << "出力するテキスト" << 123<< ”End!!”<< std::endl;
cout << "出力するテキスト" << 123<< ”End!!”<< endl;

「using namespace std;」を宣言した場合、「std::」を省略できる。


サンプルコード

#include <iostream>
using namespace std;

int main()
{
cout << "出力される文字列" << 123<< ”End!!”<< endl;
}



「std::cout」は、文字列や変数を出力するための関数で、先頭に記述。
「std::endl」は、「endline」の意味し、改行してバッファーをフラッシュするため関数で、末尾に記述する。
改行(\n)して、バッファーをフラッシュするなら、末尾は「std::endl」を使い、
改行(\n)せずフラッシュするなら、末尾は「std::flush」を使う。




入出力演算子とは


入出力演算子は、入力と出力に使われる記号。
演算子だけでは、入出力を実行できないので、 入出力の関数に演算子を使用して入出力を行う。


変換指定文字説明データ型
%C 1文字を入出力する 文字型
%s 文字列として入出力する 文字列
%d 10進数で入出力する 整数型
%x 16進数で入出力する 整数型
%o 8進数で入出力する 整数型
%f [-]dddd.dddddd形式で入出力する 浮動小数点型
%e 指数形式で入出力する 浮動小数点型


入力演算子

入力変換指定子とは


「sscanf」「vsscanf」「scanf」などの関数では、
「%」を使用して、入力するデータの書式を指定する。



sscanf( "ABC", "%s", a ); // a[]="ABC"
sscanf( "ABC", "%2s", a ); // a[]="AB"
sscanf( "ABC", "%c", a ); // a[0]='A'
sscanf( "ABC", "%2c", &a ); // a[0]='A', a[1]='B'
sscanf( "123", "%d", &i ); // i=123
sscanf( "123", "%2d", &i ); // i=12
sscanf( "1,2", "%d,%d", &i, &j ); // i=1, j=2
sscanf( "123", "%ld", &li ); // li=123
sscanf( "314e-2", "%f", &f ); // f=3.14
sscanf( "314e-2", "%lf", &d ); // d=3.14
sscanf( "AAABBC", "[AB]", a ); // a="AAABB" (簡易正規表現)



入力変換指定子の構文

%[*][width][modifier]type]

入力変換指定子の構文は、多くの点で出力変換指定子を同じです。 modifier と type により、sscanf 関数などの引数に指定する変数の型が決まります。次はその例です。


指定 (Type)
d,i,u,x int* または unsigned*
ld,LI,lu,,lx long* または unsigned long*
f,e,g float*
lf,le,lg double*
c,s char*
C,S wchar_t*
n int*
p void**
Fp void far**
Np void near**
Fd int far*
Nd int near*



* (アスタリスク)


% の直後に * を指定すると、そのデータは、変数に格納されずに読み飛ばされます。この場合、対応するアドレスを scanf などの引数に渡す必要はありません。

int i;


sscanf( "1,2,3", "%*d,%*d,%d", &i ); // i=3



width (出力幅)

入力データの最大バイト数を 10 進文字列で指定。type が p の場合は無視されます。



int a, b, c;


sscanf( "12345", "%1d%2d%3d", &a, &b, &c ); // a=1, b=23, c=45



modifier (修飾子)

指定 説明
h type で整数を指定する場合に、引数が int ではなく short へのポインタであることを示す。Light C では int と short が同一なので、効果はありません。
l type が整数の場合は引数が int ではなく long へのポインタであることを示し、type が小数の場合は引数が float ではなく double へのポインタであることを示す。
L type で小数を指定する場合に、引数が long double 型であることを示す。Light C では long double と double が同一なので、効果はありません。
F 引数が far ポインタであることを示す。ただし、type が p の場合は、引数でポイントされるポインタが far であることを示す。
N 引数が near ポインタであることを示す。ただし、type が p の場合は、引数でポイントされるポインタが near であることを示す。



type (型)

文字列をどのような種類の値として解釈するかを指定。


指定 解析される文字列の構文 説明
d, i [+|-]ddd 文字列を符号付き 10 進数として解析し、結果を (long) int に格納。
u [+]ddd 文字列を符号なし 10 進数として解析し、結果を (unsigned long) int に格納。
X, x [+][0x|0X]hhh 文字列を 16 進数として解析し、結果を (unsigned long) int に格納します。文字列の先頭に 0x または 0X が付いていてもかまいません。
o [+]ddd 文字列を 8 進数として解析し、結果を (unsigned long) int に格納。
q [+]ddd 文字列を 4 進数として解析し、結果を (unsigned long) int に格納します。[LC]
b [+]ddd 文字列を 2 進数として解析し、結果を (unsigned long) int に格納します。[LC]
p hhh または hhh:hhh ポインタ値の表現を読み込みます。small/medium モデルの場合と、modifier に N を指定した場合は、4 桁以下の 16 進数を入力し、near ポインタとして格納します。そうでない場合は、4 桁以下の 16 進数、コロン (:)、および 4 桁以下の 16 進数を順に入力し、far ポインタとして格納。
s [^ \t\n\v\f\r]... ホワイトスペース以外のバイトを連続して入力し、末尾に 0 を付加して、結果を char [ ] に格納。
c (任意の n バイト) 1 バイトを入力し、結果を char に格納します。width を指定した場合は、そのバイト数分のデータを連続して入力し、結果を char [ ] に格納。
S [^ \t\n\v\f\r]... s と似ていますが、結果を wchar_t [ ] に格納する点が異なる。
C c と似ていますが、結果を wchar_t または wchar_t [ ] に格納する点が異なる。
f,e,g,E,G [+|-][ddd][.ddd][{E|e}ddd] 文字列を小数として解析し、結果を float または double に格納。
n これまでに入力したバイト数を int に格納。
c と C 以外では、入力データ先頭のホワイトスペースは読み飛ばされます。



出力演算子

出力変換指定子とは

sprintf、vsprintf、printf などの関数では、% を使用して、出力するデータの書式を指定。


printf( "%s", "123" ); // → "123"
printf( "%4d", 456 ); // → " 456"
printf( "%05X", 254 ); // → "000FE"
printf( "%-5s", "abc" ); // → "abc "
printf( "%f", 12.56637061 ); // → "12.566371"
printf( "%.2f", 12.56637061 ); // → "12.56"
printf( "%e", 12.56637061 ); // → "1.256637e+001"
printf( "%g", 12.56637061 ); // → "12.5664"
printf( "xyz%n", &i ); // i に出力バイト数 (3) が入る



出力変換指定子の構文

%[flags][width][.precision][modifier]type



flags (フラグ)

- 出力内容より width が大きい場合に、左に寄せて出力。出力内容より width が小さい場合は、効果がありません。
+ 負でない数に「+」を付加します。type が数値でなければ無視されます。
(空白) 同上
# 型がわかる形式で数値を出力。
8 進数 - 先頭に 0 が付加されます。
16 進数 - 先頭に 0x または 0X が付加されます。
浮動小数点数 - 必ず小数点が出力されます。g または G 形式の場合は、末尾の不要な 0 も削除されません。
, 整数を 3 桁ごとにカンマ (,) で区切ります。[LC]



width (出力幅)

(数字) 出力全体の桁数を指定します。先頭に 0 を付けると、余分な桁は文字 0 で埋められます。それ以外の場合は、スペース文字で埋められます。
* 次の int 型の引数で渡された値を使用。値が負の場合は、左寄せになります。

printf( "i=%*d\n", 10, i ); // i を 10 桁で表示



precision (精度)

(数字) 出力桁数を指定します。負の precision は無視されます。ピリオドだけを記述して数値を省略すると、0 と見なされます。効果は type によって異なります。 整数 - 出力内容が指定桁数に満たない場合は、左側に文字 0 が補充されます。出力内容が指定桁数を超える場合は、効果がありません。precision が 0 で出力も 0 の場合は、何も出力されません。既定値は 1 です。 例 printf( "%5.3d", 12 ); // " 012" と表示される f, e, E - 小数点以下の桁数を指定します。0 を指定すると、flags に # を指定しない限り、小数点も出力されません。既定値は 6 です。 g, G - 整数部と小数部を合わせた桁数を指定します。既定値は 6 です。 文字列 - 出力の最大桁数を指定します。
* width と同様に、次の int 型の引数で渡された値を使用します。



modifier (修飾子)

h type で整数を指定する場合に、引数が short 型であることを示す。Light C では int と short が同一なので、効果なし。
l type で整数を指定する場合に、引数が long 型であることを示す。
L type で小数を指定する場合に、引数が long double 型であることを示す。Light C では long double と double が同一なので、効果なし。
F type で文字列 (s) またはポインタ (p) を指定する場合に、引数が far ポインタであることを示す。
N type で文字列 (s) またはポインタ (p) を指定する場合に、引数が near ポインタであることを示す。



type (型)


引数の型を指定します。


d int 値を符号付き 10 進数として出力。
i d と同じです。
u int 値を符号なし 10 進数として出力。
X int 値を符号なし 16 進数として出力。10 ~ 15 の桁は 'A' ~'F' で表示。
x int 値を符号なし 16 進数として出力。10 ~ 15 の桁は 'a' ~'f' で表示。
o int 値を符号なし 8 進数として出力。
q int 値を符号なし 4 進数として出力。[LC]
b int 値を符号なし 2 進数として出力。[LC]
p ポインタの値を 16 進数で出力。
s ヌル終端文字列へのポインタを受け取り、文字列を出力。
c int 値を文字として出力。Shift-JIS の全角文字も出力可能。
S ワイド文字列を出力。
C c と同じです。
f double 値を通常の小数表現で出力。 (例:12.566371)。
e double 値を指数表現で出力。 (例:1.256637e+001)。
E e の代わりに E を出力することを除き、e と同じ。(例:1.256637E+001)。
g 数値の大きさに応じて、f または e のいずれかの書式で出力。 (例:12.5664、2.99792e+008)。数値の絶対値が大きすぎて precision の桁数に収まらない場合と、数値の絶対値が 0.0001 より小さい場合は、e 形式を使用。それ以外の場合は、f 形式を使用。
G e の代わりに E を出力することを除き、g と同じ。
n 次の引数で指される int 変数に、これまでに出力したバイト数を格納。

printf( "xyz%n", &i );
// i に 3 が入る
  • % 自体を出力するには、「%%」と記述。
  • char 型の数値は、関数に渡されるときに自動的に int 型に変換されるため (汎整数拡張)、int 型と同じように「%d」、「%X」などを使って表示。
  • float 型の数値は、関数に渡されるときに自動的に double 型に変換されるため、double 型と同じように「%f」、「%e」などを使って表示。


Back