ITメモ
C言語 / Programming Language C
開発環境 / Development Environment
【Mac】Xcode【Win】Visual Stadio
基礎 / Basic
About C言語書式コメントコンパイルとリンクメイクファイル / Makefileヘッダファイル変数定数型 / Type配列 / Arrayポインタ / Pointer演算子 / Operator制御文 / Control Statement関数指定子 / 修飾子構造体と共用体 / Structure & Unionプリプロセッサ / PreprocessorthisキーワードTypedef
入出力 / Input & Output
入出力入力フォーマット指定子出力フォーマット指定子「printf」関数を使って文字を出力・表示させる方法「printf_s」関数を使って文字を出力・表示させる方法「scanf」関数を使って入力させる方法「scanf_s」関数を使って入力させる方法「getchar」関数を使って「1文字」だけ入力させる方法「gets」関数を使って「文字列」を入力させる方法
文字列 / String
文字列 / String「snprintf」関数で「配列」に文字列を書き込む方法
ネットワーク / Network
memset - メモリブロックのセット
メモリー管理
メモリー
オペレーション / Operation
ファイルを操作をする方法コマンドラインプログラム / Command-Line Programプロセス / Processソケット通信 / Socket Communication
用語集 / Glossary
サブルーチン / Subroutineスタックとキュー / Stack & Cueスレッド / Thread
C言語標準ライブラリ(ヘッダファイル)
C言語標準ライブラリ【assert.h】 - 診断機能【complex.h】 - 複素数計算【ctype.h】 - 文字操作【errno.h】 - エラー【fenv.h】 - 浮動小数点環境【float.h】 - 浮動小数点型の特性【inttypes.h】 - 整数型の書式の変換【iso646.h】 - 代替つづり(Alternate spellings)【limits.h】 - 整数型の大きさ【locale.h】 - 文化圏固有操作【math.h】 - 数学【setjmp.h】 - 非局所分岐【signal.h】 - シグナル操作【stdalign.h】 - アライメント【stdarg.h】 - 可変個数の実引数【stdatomic.h】 - アトミック操作【stdbool.h】 - 論理型および論理値【stddef.h】 - 共通の定義【stdint.h】 - 整数型【stdio.h】 - 入出力【stdlib.h】 - 一般ユーティリティ【stdnoreturn.h】 - _Noreturn【string.h】 - 文字列操作【tgmath.h】 - 型総称数学関数(Type-generic math)【threads.h】 - マルチスレッド【time.h】 - 日付及び時間【uchar.h】 - Unicodeユーティリティ【wchar.h】 - 多バイトおよびワイド文字拡張ユーティリティ【wctype.h】 - ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ
C言語ライブラリ(ヘッダファイル)
C言語ヘッダファイル【winsock.h】





【C言語】「scanf」関数を使って入力させる方法

【C言語】
「scanf」関数を使って入力させる方法




「C言語」の「scanf」関数は、
標準入力である「キーボード」などから、
「数値」「文字」「文字列」などを
入力した値を受け取ることができる関数。





「scanf」関数とは


「scanf」関数は、
簡単にいうと、
「キーボード」からの入力を受けとるのに使用される関数です。

「Visual Studio」では、
「scanf」関数を使用すると、「scanf_s」関数を使用するように「エラー」が出ます。
「scanf_s」関数は、
「scanf」関数の「セキュリティ強化版」。
使用方法は、「scanf」関数と同じなので、
「Visual Studio」では、「scanf_s」関数を使用します。


「scanf」関数には、
セキュリティ強化版の「scanf_s」関数もある。


「%d」「%f」などの「書式文字」を使用して、
キーボードなどから入力された「数値」「文字」「文字列」などを受け取り、
「変数」に格納してくれる。


標準出力に「出力」できる「printf」関数と、
真逆の「入力」を担当する「scanf」関数は、
「printf」関数共に、
良く使用される関数の一つとなっている。


「scanf」関数の類似関数には、

・「scanf_s」関数
・「fscanf」関数
・「sscanf」関数
・「vscanf」関数

などがあり、
の書式指定文字列も同様の使用方法です。


Back

「scanf_s」関数とは


「scanf_s」関数は、
「scanf」関数の「セキュリティ強化版」。


「Visual Studio」で開発を行うと、
「scanf」関数を使用して「コンパイル」を実行すると、
「エラー」が発生し、
「scanf_s」関数を使用するように警告される。


「scanf_s」関数の使用方法は、
「scanf」関数とほぼ同じですが、
受け取るデータの「サイズ」を指定することが必要です。
「変換指定子」を指定して、
データサイズが決まっている場合は、
「サイズ」指定をしなくても良いことになっています。


「scanf_s」関数の書式
scanf_s(”書式文字列”, 文字列のアドレス, サイズ);



サンプルコード
#include <stdio.h>
#include <stdlib.h>

int main(void) {
printf("「文字列」を入力し、「Enter」キーを押して下さい。\n");

char str[16];
scanf_s("%s", str, 16);

printf("入力した「文字列」は:%s\n", str);

// 出力表示のための一時停止
system("pause");

return 0;
}


Back

標準「C言語」で開発をしたいときの設定方法


「scanf_s」関数などの「セキュア関数」は、
「マイクロソフト製コンパイラ」でしか利用できないので、
標準の「C言語」で
開発プログラミングコードを記述したい場合は、
下記の「プリプロセッサ命令」を
ソースコードの先頭に記述する。
記述することで、
警告が表示されなくなる。
#pragma warning(disable: 4996)



「マイクロソフト製コンパイラ」でのみ使用できる
「scanf_s」関数などの「セキュア関数」は、
C言語関数名_s
という表記になっていて、
「C言語」の関数名に、「_s」が加えられている名前が、
マイクロソフト製のセキュア関数となっている。


Back

「scanf」関数の書式


「scanf」関数は、
「キーボード」などの「標準入力」から、
「記号」「数字」「文字」「文字列」を入力させ、
変数などに保管することができる関数なので、
受け取るための「書式」を指定して、
データを受け取り保存する「変数」「配列」を指定する必要がある。


入力データの書式は、
「変換指定子」を使用して、
入力するデータの種類などを指定することができる。


「変換指定文字列」は、
「変換指定子」が1つ以上含まれている文字列のことを意味する。
「入力」を受け取る「scanf」関数などは、
受け取るデータの種類を、
「変換指定子」を組み合わせることで、
指定することができるようになっている。



「scanf」関数の書式
scanf(変換指定文字列[,格納可変個引数]);

scanf(”変換指定文字列”, &変数名1, &変数名2, ・・・);
scanf(”変換指定文字列”, 配列名);
scanf(”変換指定文字列”, &配列名[3]);



サンプルコード


#include <stdio.h<

int main(void) {
printf("数字を入力してEnterボタンを押してください\n");

int GetNum;
scanf("%d", &GetNum);

printf("入力された数値は、:「%d」です。\n", GetNum);

return 0;
}



Back

「scanf」関数で使える「変換指定子」


「scanf」関数で使える「変換指定子」は、
特に特別なものはなく、
「C言語」で使われる「変換指定子」が使用できる。

「変換指定子」は、
入力する「文字列」の変数の型を指定するもので、
記号を使用し、変数の「型」によって使用する「変換指定子」が異なります。

主な変換指定子とそれに対応する変数の型は次の通りです。


「変換指定子」の種類
%指定子対応する型説明
%cchar文字
%schar *文字列
%dint, short10進の整数
%ffloat浮動小数点数
%lfdouble倍精度浮動小数点数



Back

引数で使用する「変換指定」のフォーマット


引数で使用する「変換指定」のフォーマットは、
%[引数順][フラグ][最小フィールド幅][.精度][長さ修飾子]変換指定子


一番シンプルな変換指定
%変換指定子
という書式で指定する。
「変換指定文字」を利用した場合は、
最低でも、「%変換指定子」を記述することになる。


「変換指定文字列」は、

・変換指定子をひとつ以上含む文字列
・「%」記号から始まる
・「変換指定文字列」以外の文字列はそのまま出力される

などの条件があります。


「printf」関数の
引数で指定した「書式文字列」内に、
次の引数以降の「文字列」「変数の値」を組み込むには、
「%」記号の後に、
「変数の型」を表す「変換指定子」を記述することで、
引数で指定した文字列の中にある
「書式文字列」を指定した「文字列」「変数値」に置換えて、
文字列を表示することができる。






変換指定文字列「変換指定子」の種類

「変換指定子」は、
「引数」で指定した値を表示する形式を指定する。

「変換指定文字列」を使用して出力をする場合、
「変換指定子」は、

・「アルファベット」「記号」の「1文字」で指定する
・「変換指定子」を省略することはできない

というルールがある。


「変換指定子」として使える文字
変換指定子説明
d符号付きの「10進整数」を扱う「変換指定子」。
i符号付きの「10進整数」を扱う「変換指定子」。
u符号なしの「10進整数」を扱う「変換指定子」。
o符号なしの「8進整数」を扱う「変換指定子」。
x、X 符号なしの「16進整数」を扱う「変換指定子」。
「x」は、アルファベットの「小文字」で表示。
「X」は、アルファベットの「大文字」で表示。
f、F 「浮動小数点数」を扱う「変換指定子」。
「小数点以下(ddd.ddd)」を表示する
「F」は、アルファベットを「大文字」で表示する。
e、E 「浮動小数点数」を扱う「変換指定子」。
「小数」の「指数表記(ddd.ddde±dd)」
「E」は、指数を表す「e」を「大文字」で表示する。
g、G 「浮動小数点数」を扱う「変換指定子」。
小数の16進指数表記(0xddd.dddp±dd)
「f」または「e」での変換のどちらか表示が短い方で表示。
指数部が「-4」より小さい場合か、「精度指定」以上の場合に、「e」が使用される。
「G」はアルファベットを「大文字」で表示する。
a、A 「16進浮動小数点数」を扱う「変換指定子」。
「A」は、アルファベットを「大文字」で表示する。
c 「文字」を扱う「変換指定子」。
「int型」の実引数を「unsigned char型」に変換し、結果を「文字」で表示する
s 「文字列」を扱う「変換指定子」。
「文字列」への「ポインタ」を実引数に指定し、末尾にある「null文字」の直前まで表示する。
p 「ポインタ」を扱う「変換指定子」。
任意の型のポインタを実引数に指定し、16進数で表示
n 「整数へのポインタ」を扱う「変換指定子」。
現時点までに出力された文字数を整数へのポインタに格納する。
※Visual Studioではセキュリティ上の問題で標準では無効
% 「%」を表示する「変換指定子」。
「%%」と入力することで、「%」を文字として扱う。

Back



変換指定文字列「フラグ」の種類

「変換指定文字列」の「フラグ」は、
「出力位置」「変換指定文字列の意味」を設定することができる。

「フラグ」は、
・「複数指定」が可能
・「順序」は任意
・「フラグ」は省略可能
という条件で記述する。



変換指定文字列「フラグ」の一覧
フラグ説明既定値
- フィールドの左揃え 右揃え
+ 数値の前に、常に「符号(+-)」を表示するフラグ。
「正の数字」=「+」の符号を表示
「負の数字」=「-」の符号を表示
「負の数字」のみ
0 「最小桁数」に達するまで「空白」を「0」に変換して埋めるフラグ。
「整数値」の「精度指定」がされている場合
「-」フラグと同時指定された場合
などは、「0」フラグは「無効」となる。
空白で埋める
空白 「符号付き」の「数値」で符号が表示されない場合に、空白で埋めるフラグ。
「+」フラグと同時に指定された場合は、
「空白」フラグは無効となる。
何もしない
# 「o」変換(8進数表記)の場合、
先頭に「0」が追加される値が「0」の場合は何もしない
何もしない
# 「x、X」変換(16進数表記)の場合、
先頭に「0x、0X」が追加される値が「0」の場合は何もしない
何もしない
# 「e、E、f、F、a、A」変換(小数値)の場合、
小数点以下の数値を表示しない場合でも「小数点」を表示する
何もしない
# 「g、G」変換(double型)の場合、
小数点以下の数値を表示しない場合でも「.0」を表示する
何もしない
#上記以外の変換に「#」フラグを使用した場合は、未定義となる-

Back



変換指定文字列「最小フィールド幅」の種類

変換指定文字列「最小フィールド幅」は、
表示される「文字列」の「最小文字数」を指定する「変換指定文字」。

表示する文字数が、
指定よりも多い文字数の場合は、
自動で拡張され、全部表示される。

変換指定文字列「最小フィールド幅」は、
省略も可能。
使用するときだけ記述する。


変換指定文字列「最小フィールド幅」の指定は、
・正の整数値
・アスタリスク(*)
で指定する。

「アスタリスク(*)」で指定した場合は、
次の「引数」に記述する「数値」が、
「最小フィールド幅」の値として設定される。
「"%0*d, %0*d, ・・・・・", 最小フィールド幅, 変換される値, 最小フィールド幅, 変換される値...」

printf("%0*d, %0*d", 最小フィールド幅, 数値, 最小フィールド幅, 数値);

printf("%0*d, %0*d", 5, 123, 5, 456);

00123, 00456

Back



変換指定文字列「精度指定」の種類

変換指定文字列「精度指定」は、
表示する「文字列」の「文字数」を指定する「変換指定文字」

変換指定文字列「精度指定」は、
指定しない場合は「省略可能」。


変換指定文字列「精度指定」の指定は、
・「.(ピリオド)」に続く「正の整数値」
・「.(ピリオド)」に続く「アスタリスク(*)」
で指定する。
「アスタリスク(*)」指定の時の「負数」による「精度指定」には反応しない。

「アスタリスク(*)」で指定した場合は、
次の「引数」に記述する「数値」が、
「最小フィールド幅」の値として設定される。
「"%0.*d, %0.*d, ・・・・・", 精度指定, 変換される値, 精度指定, 変換される値...」

printf("%0.3d, %0.3d", 数値, 数値);
printf("%0.*d, %0.*d", 最小フィールド幅, 数値, 最小フィールド幅, 数値);

printf("%0.5d, %0.5d", 123, 456);
printf("%0*d, %0*d", 5, 123, 5, 456);

00123, 00456
00123, 00456



変換指定文字列「精度指定」の一覧
変換指定子説明既定値
d、i、o、u、x、X 最小桁数の指定
指定の値が実際の文字数よりも小さい場合は0で埋める
1
e、E、f、F 小数部(小数点の後ろの数値)の有効桁数の指定 桁の最後は丸められる(四捨五入される) 6
g、G有効桁数の指定6
s有効文字列数表示される文字列の文字数
上記以外の変換指定子に精度指定をした場合の動作は未定義です。
Back



変換指定文字列「長さ修飾子」の種類

変換指定文字列「長さ修飾子」は、
実引数の「データ型」の「サイズ」を指定する「変換指定文字」。
変換指定文字列「長さ修飾子」は、
使用しない場合は、「省略可能」です。


変換指定文字列「長さ修飾子」の一覧
長さ修飾子変換指定子データ型
hhd、i、o、u、x、Xchar型、unsigned char型
nchar型のポインタ
hd、i、o、u、x、Xshort型、unsigned short型
nshort型のポインタ
l(小文字のL)d、i、o、u、x、Xlong型、unsigned long型
nlong型のポインタ
ll(小文字のLL)d、i、o、u、x、Xlong long型、unsigned long long型
nlong long型のポインタ
La、A、e、E、f、F、g、Glong double型
jd、i、o、u、x、Xintmax_t型(対応する中で最大の整数値を扱うデータ型)
zd、i、o、u、x、Xsize_t型
td、i、o、u、x、Xptrdiff_t型(ポインタ同士を減算した値を扱う型)


「Microsoft」独自の拡張長さ修飾子
長さ修飾子変換指定子データ型
l(小文字のL)a、A、e、E、f、F、g、Glong double型
hc、C1バイト文字
I32d、i、o、u、x、X__int32型、unsigned __int32型
I64d、i、o、u、x、X__int64型、unsigned __int64型


Back