この章の補足内容については、「14 フォーマットされた入出力の補足」を参照してください。
1.printf関数
1.1. フォーマット:
printf ( 格式串,表达式1 , 表达式2 ) ;
書式文字列 =変換記述+ 通常の文字
変換記述の数と出力項目の数は等しく、変数の型の対応も含めて 1 対 1 に対応する必要があります。printf("%d %d", a,b); //正确 printf("%d %d", a); //错误! printf("%d", a,b); //错误!
1.2. 変換手順 (フォーマット情報を含む)
形式:例: 、`%3.4f
% m.p X
%3d
m - 最小列幅。表示する最小文字数を示します。データの実桁数がmより大きい場合は完全に表示され、それ未満の場合は右詰めで左のスペースが埋められます。m が負の場合は、左揃えになります。浮動小数点型の場合、m には小数点以下の桁数も含まれます。
- 例:
元のデータは 1234、%3d の出力は 1234、%5d の出力は·1234
(右揃え、左はスペースで埋められます)
p - 精度。変換タイプ X に依存
- X は d (10 進整数) です。p は最小数を指定します。不足の場合は左側にゼロが埋められます。。p を指定しない場合、デフォルトは 1 になります。
- X は e (指数、科学的表記法) です。p は小数点以下の桁数を示し、小数点が足りない場合は末尾に 0 が追加され、デフォルトは 6 桁になります。p=0、小数点は表示されません。
- X は f (固定小数点 10 進数)、p は小数点以下の桁数を表します。
- X は g (指数形式 + 固定小数点 10 進浮動小数点数) です。 p は指数の最大有効桁数(小数点以降の桁数ではありません)を表します。末尾の 0 は表示されず、小数点がない場合は小数点も表示されません。
要約する: m は最小列幅を指定し、p は浮動小数点型の小数点以下の最大桁数を指定し、整数型の最小桁数を指定します (m とは若干異なります)。
例:
int i;
float x;
i = 40; x = 839.21f;
printf("|%d|\n",i); //加“|”便于观察输出长度
printf("|%5d|\n",i);
printf("|%-5d|\n",i);
printf("|%5.3d|\n",i);
printf("|%10.3f|\n\n",x);
printf("|%10.3e|\n",x); //注意这个
printf("|%-10g|\n",x);
出力は次のとおりです。
1.3、エスケープシーケンス
1.3.1 シンボルのエスケープシーケンス
例:
\n - 改行
\a - ベルベル
\b - 1 ビット戻る
\t - 水平タブ、カーソルを次のタブ文字の位置に移動します。水平タブの幅はオペレーティング システムによって決定され、通常は 8 文字幅です
\"—— 文字 ""
" を表し、 ""
" は文字列の先頭と末尾をマークします
\\—— を表示します\
プログラム例1:
printf("Item\tUnit\cPurchuse\n\tPrice\tDate\n");
printf("\"Hello\"");
出力は次のとおりです。
1.3.2 数値エスケープシーケンス
シンボリック エスケープ シーケンスは、対応する ASCII コード (8 進数または 16 進数) を数値エスケープ シーケンスに置き換えることによって使用できます。例: \n
== \12
== \x0a
==\x0A
詳細については、ASCII コード表を参照してください。
2、scanf関数
1. 形式:
scanf
関数の形式はprintf
関数と同じです。
例:
int i,j;
float x,y;
scanf("%d%d%f%f",&i,&j,&x,&y); //scanf函数转换说明紧挨着的情况很普遍,printf则少有
例証します:
- 変換命令と変数は等しく 1 対 1 で対応する必要があります。
- 変数の型も対応する必要がある
&
シンボルは省略できません。省略すると、「形式引数がポインタではありません」という警告が生成される可能性があります。- 関数を使用したデータの読み取り
scanf
はシンプルで効果的ですが、理想的ではありません。文字形式で読み取り、数値形式に変換できます。 - 関数にポインタが渡されると、次のようになります。
int i, *p; //定义指针变量
p = &i; //指针p存储i的地址
scanf("%d", p); //传入p,无需&符号
↑↓ 上下のコードは等価です ↑↓
int i;
scanf("%d", &i);
2. 作業方法
(1)読み取りプロセス
- 変換仕様は、入力データ内で適切なタイプの項目を検索し、この項目に適合しない文字が見つかった場合に停止して、その文字を元の位置に戻します。
- 数値の先頭を検索する場合、空白文字 (スペース、水平/垂直タブ、フォームフィード、改行を含む) は無視されます。
(2) 識別ルール
A. 整数の場合:
- まず、プラスの兆候とマイナスの兆候を探します。
- もう一度数字を探してください。
- 数字以外の場合は停止します。
B. 浮動小数点型の場合 (%f、%e、および %g は同じです):
- 標識を探してください。
- 数値を検索します (小数点が含まれる場合があります)。
- 指数 (文字 e/E、オプションの記号、数字で構成されます) を探します。
例:
入力データの呼び出しステートメントは
1-20.3-4.0e3
次のとおりです。scanf("%d%d%f%f",&i,&j,&x,&y);
入力結果は次のようになります。
i = 1; j = -20; x = 0.3; y = -4000;
詳細な通話プロセス:
- 変換仕様 %d。最初の非 null 入力文字は 1 です。整数は 1 から始めることができるため、scanf 関数は次の文字 (-) を読み取ります。scanf 関数は、文字 - が整数に含まれないことを認識するため、変数 i に 1 が格納され、文字 - が戻されます。
- 変換仕様 %d。続いて、scanf 関数は文字 -、2、0、および . (ピリオド) を読み取ります。整数には小数点を含めることができないため、scanf 関数は変数 j に -20 を格納し、文字 . を元に戻します。
- 変換仕様 %f。次に、scanf 関数は文字 .、3、および - を読み取ります。浮動小数点数では数値の後に負符号を付けることができないため、scanf 関数は変数 x に 0.3 を格納し、文字 - を置き換えます。
- 変換仕様 %f。最後に、scanf 関数は文字 -、4、.、0、e、3、および ¤ (改行) を読み取ります。浮動小数点数には改行を含めることができないため、scanf 関数は [イラスト] を変数 y に格納し、改行を戻します。
- この例では、scanf 関数は、フォーマット文字列内の各変換仕様を入力項目と照合します。改行は読み取られないため、次の scanf 関数呼び出しまで残されます。
3. フォーマット文字列内の通常の文字
空白文字
scanf
関数内のフォーマット文字列内の空白文字の数は重要ではありません。
//以下两条语句等价
scanf("%d %d %f%f");
scanf("%d%d%f%f");
- フォーマット文字列内の空白文字は、入力内の任意の数の空白文字 (0 を含む) と一致します。
scanf("%d /%d",&num,&denum); //读取分数,输入的分号"/"前后可以有任意数量的空格,同样匹配
scanf("%d/%d",&num,&denum); //读取分数,输入的分号"/"前面不能紧邻空格,否则不匹配
その他のキャラクター(難易度)
scanf
関数書式文字列に他の文字があった場合は入力文字と比較し、一致する場合は続行し、一致しない場合は異常終了します。
例:
- フォーマット文字列が
"%d/%d"
、入力が である場合·5/·96
(• はスペースを意味します)、一致します。- 入力が の場合
·5·/·96
、フォーマット文字列の は/
入力の 2 番目のスペースと一致しないため、このscanf
関数は異常終了します。%d /%d"
(フォーマット文字列の対応する位置にスペースがあります)·5·/·96
の入力と一致します。
注:
scanf
この関数はフォーマット文字列に基づいて入力データを取得し、フォーマット文字列内の空白文字は直接無視されます。重要なのは、その順序を理解することです。
4. printf関数とscanf関数の違い
- どちらの関数もデータを呼び出します。
scanf
関数呼び出しには&
シンボルを含める必要がありますが、printf
関数にはシンボルを含めることはできません。scanf
通常、関数がデータを検索するとき、変換の説明を除き、空白文字はスキップされます。フォーマット文字列には他の文字 (空白文字を含む) は必要ありません。printf
関数のフォーマット文字列は通常\n
、 で終わります。scanf
そうでない場合、プログラム エラーが発生します。scanf
関数を使用すると、分数全体を読み取ることができます。
3、Q&A
%i
との%d
違い
機能に関しては
printf
、違いはありません。scanf
関数は10%d
進数のみ%i
読み込めますが、8進数、10進数、16進数も読み込めます。たとえば、(接頭辞 0 を持つ) を 8 進数として%i
、(接頭辞 0x を持つ) を 10 進数として扱います。056
56
0x56
%
シンボルを表示するにはどうすればよいですか?
表示したいシンボル
%
の前に追加のシンボルを追加します%
。printf("%%"); //显示1个% printf("%%%"); //显示2个%
- ユーザーが 2 つの数字の間に「 」を入力すると
,
、scanf
関数はそれをどのように処理するのでしょうか?
例:
scanf("%d%d",&i,&j);
入力: 4,28
結果:scanf
関数は 4 を に格納した後に戻りますi
。,28
次のscanf
関数呼び出しまでそのままにしておきます。