【C基礎】02 書式付き入出力【scanf関数/printf関数】

この章の補足内容については、「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 対 1 で対応する必要があります。
  2. 変数の型も対応する必要がある
  3. &シンボルは省略できません。省略すると、「形式引数がポインタではありません」という警告が生成される可能性があります。
  4. 関数を使用したデータの読み取りscanfはシンプルで効果的ですが、理想的ではありません。文字形式で読み取り、数値形式に変換できます。
  5. 関数にポインタが渡されると、次のようになります。
	int i, *p;      //定义指针变量
	p = &i;        //指针p存储i的地址
	scanf("%d", p);   //传入p,无需&符号

↑↓ 上下のコードは等価です ↑↓

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

2. 作業方法

(1)読み取りプロセス

  • 変換仕様は、入力データ内で適切なタイプの項目を検索し、この項目に適合しない文字が見つかった場合に停止して、その文字を元の位置に戻します。
  • 数値の先頭を検索する場合、空白文字 (スペース、水平/垂直タブ、フォームフィード、改行を含む) は無視されます。

(2) 識別ルール

A. 整数の場合:

  1. まず、プラスの兆候とマイナスの兆候を探します。
  2. もう一度数字を探してください。
  3. 数字以外の場合は停止します。

B. 浮動小数点型の場合 (%f、%e、および %g は同じです):

  1. 標識を探してください。
  2. 数値を検索します (小数点が含まれる場合があります)。
  3. 指数 (文字 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 進数として扱います。056560x56

  • %シンボルを表示するにはどうすればよいですか?

表示したいシンボル%の前に追加のシンボルを追加します%

printf("%%");  //显示1个%
printf("%%%");  //显示2个%
  • ユーザーが 2 つの数字の間に「 」を入力すると,scanf関数はそれをどのように処理するのでしょうか?

例:

scanf("%d%d",&i,&j);

入力: 4,28
結果:scanf関数は 4 を に格納した後に戻りますi,28次のscanf関数呼び出しまでそのままにしておきます。

Supongo que te gusta

Origin blog.csdn.net/qq_43194080/article/details/122494471
Recomendado
Clasificación