【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」コマンドは、出力するためのコマンド。
一緒に使われるコマンド
書式
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