整形入出力(C言語超精細シリーズ)(1)

序文;

皆さんこんにちは、syです。今日は整形入出力(1)を中心に、printf、scanfの基本的な使い方と注意点、変換命令の簡単な理解、エスケープシーケンスの説明などをしていきます。変換命令の詳細な学習と、文字の入出力、行の入出力、ブロックの入出力など、ファイルに関連する入力バッファリングの概念の知識を継続的に学習します。今回お話しする知識は、C言語を始める際に広く取り上げられる内容と、よく踏む落とし穴をまとめたものになりますので、一緒に見ていきましょう~~

1.printf関数

 基本形式: printf (フォーマット文字列, 式 1, 式 2,... ); printf 関数は、フォーマット文字列の内容を表示し、文字列内の指定された位置に可能な値を挿入するために使用されます。printf を呼び出すときは、フォーマット文字列を指定する必要がありますフォーマット文字列の後のパラメータは、表示中に文字列に挿入される値です (定数、変数、または複雑な式を指定できます)。

フォーマット文字列: 通常の文字と変換命令が含まれます。変換命令は % で始まります 。変換指定は、印刷プロセス中に入力される値を表すために使用されるプレースホルダーです。% に続く情報は、計算および内部形式 (バイナリ) から印刷する形式への値の変換を指定します。

例: 変換の説明 %d は、printf 関数が int 値をバイナリ形式から 10 進形式に変換することを指定します。

以下の点に注意が必要です。

1. フォーマット文字列内の通常の文字は完全に「コピー」されて表示され、変換命令は表示された値で「置き換え」られる必要があります例えば:

    int i, j;
	float x, y;
	i = 1;
	j = 2;
	x = 2.55f;
	y = 20.0f;
	printf("i=%d,j=%d\nx=%f,y=%f",i,j,x,y);

出力結果: フォーマット文字列内の通常の文字「i=、j=、x=、y=、カンマ」は出力行に「コピー」され、変数 i、 j、x、y は 4 つの変換命令を順番に置き換えます。

 

2. 書式文字列の変換記述と出力項目数が一致しているか注意してください。

表示する値の数より変換命令が多い場合:

    int i = 1;
	int j = 2;
	printf("%d %d\n", i);

出力結果: printf 関数は i の値を正しく表示し、その後は意味のない値を表示することがわかります。

 

変換命令数が表示する値の数に満たない場合:

    int i = 1;
	int j = 2;
	printf("%d\n", i, j);

出力結果: i の値のみが出力され、j の値は表示されていないことがわかります。

 

·表示項目に一致する正しい変換仕様を使用することにも注意してください。

    int i = 1;
	float j = 2.5f;
	printf("%d %f", j, i);

出力結果: int型変数iとfloat型変数jの順序を間違えると意味のない出力となることがわかります。 

 

2. 変換手順

* 変換命令は、出力形式を制御するための多数の方法をプログラマに提供します。変換命令には、たとえば、小数点以下 1 桁の浮動小数点値を表示するには %.1f を使用するなど、形式情報が含まれる場合があります。

* 一般に、変換命令は%m.pX形式または-%m.pX形式で行うことができます。ここで、mpは両方とも整数定数、Xは文字です。mpは必要に応じてユーザーが定義し、pを省略した場合はmpの小数点も削除されます。

・例:変換命令10.2fでは、mが10、pが2、Xがfとなります。変換記述が %10f の場合、mは 10、p は小数点とともに省略され、変換記述が %.2f の場合、pは 2、mは省略されます。

変換の説明%m.pXでは、 m は表示される最小文字数を指定します。これは最小列幅と呼ばれます。(出力に表示される文字の総数として理解できます m)

*表示される文字数が m 未満の場合、値はフィールド内で右寄せされます (値の前にスペースを追加して数値を構成します)。たとえば、%4d では数値 123 が表示されます。 123 の形式 ( 123 の前にスペースを追加します)。

*表示する値の数が m を超える場合、列幅は自動的に拡張されます; 例: %4d は、数値 12345 を桁を失わずに 12345 の形式で表示します。

* m の前にマイナス記号を追加すると、表示される値が左揃えになります; 例: %-4d は 123 を 123 の形式で表示します (123 の後にスペースがあります)

変換記述%m.pXでは、p は精度と呼ばれます。(浮動小数点数では、小数点以下 p 桁を表現できます。)これは、値を表示する前にどのような種類の変換を実行する必要があるかを示す変換指定子 X の選択によって異なります。一般的に使用される変換指定子をいくつか示します (包括的な表については後で詳しく紹介します)。

*d - 10 進形式の整数を表します。p は表示する値の最小数を指定します (値がない場合は、数値の前にゼロを追加します)

*e - 浮動小数点数を指数 (科学表記法) 形式で表します。p は、小数点の後に表示される桁数を指定します (デフォルト値は 6)。p が 0 の場合、小数点は表示されません。

*f - 指数のない浮動小数点数を表し、p は指定子 e と同じ意味を持ちます。

*g—指数形式または固定小数点 10 進形式の浮動小数点数を表します。形式の選択は、数値のサイズによって異なります。p は、表示できる有効桁数の最大値を意味します(小数点以降の数値ではありません)。f とは異なり、g の変換では末尾のゼロは表示されません (値が次の値に変換される場合)。 g で表示されるものには小数点がありません (数値の後に g は小数点を表示しません)。中程度のサイズの数値を表示する場合、 g は固定小数点 10 進数を使用します。非常に大きい数値または非常に小さい数値を表示する場合、 g は指数形式に変換されます。

    int i;
	float x;
	i = 40;
	x = 200.20f;
	printf("|%d|%5d|%-5d|%5.3d|\n", i, i, i, i);
	printf("|%10.3f|%10.3e|%-10g|\n", x, x, x);

出力結果: 

 

 分析:

·%d - 変数 i を 10 進数形式で表示し、占有スペースを最小限に抑えます。

·%5d - 変数 i を 10 進数形式で表示し、少なくとも 5 文字のスペースを占めます。i は 2 文字しか占有しないため、先頭に 3 つのスペースが追加されます。

·%-5d - 変数 i を 10 進数形式で表示し、少なくとも 5 文字のスペースを占めます。i の値は 5 文字である必要はないため、後続の位置にスペースが追加されます (数値は左揃えになります)。

%5.3d - 変数 i を 10 進数形式で表示し、少なくとも 5 文字のスペースを使用し、少なくとも 3 桁の数字を持ちます。変数 i は 2 文字の長さしかないため、3 桁になるように追加のゼロを追加する必要があります。 (現在、長さは 3 文字のみです。5 文字を占めるようにするには、スペースを 2 つ追加する必要があります。右揃えであることに注意してください。)

·%10.3f - 変数 x を固定小数点 10 進形式で表示します。小数点以下 3 桁を含む合計 10 文字です。変数 x には 7 文字しか必要ないため (小数点を含めて)、3 つのスペースが追加されます。フロント。

·%10.3e - 変数 x を指数形式で表示します。合計 10 文字、小数点以下 3 桁になります。従属変数 x は 9 文字なので、先頭にスペースが追加されます。

`%-10g—変数 x は、固定小数点 10 進数形式または指数形式で、合計 10 文字で表示できます。数値が小さいため、固定小数点 10 進数形式が選択され、左詰めで表示されます。スペース4つ。

3. エスケープシーケンス

 フォーマット文字列で一般的に使用される \n は、エスケープ シーケンスと呼ばれます。エスケープ シーケンスには、コンパイラ エラーを引き起こすことなく特殊文字が含まれることがよくあります。これらの文字には、非印刷制御文字や特別な意味を持つ文字が含まれます。まず、よく使用されるエスケープ文字をいくつか紹介します。

*警報ベルの記号: \a //音が鳴ります

*戻り文字: \b //カーソルは現在位置から 1 つ前の位置に戻ります

*改行:\n //カーソルが次の行の先頭にジャンプします

*水平タブ: \t // カーソルを次のタブ位置に移動します (一般的に言えば、水平タブ間の距離は // 8 文字で、これは現在の長さを 8 文字にすることを意味します。ただし、これは //使用しているオペレーティング システム (通常は 8 の整数倍)

* は文字 ":\" を表します //出力文字を表示します "

 

·次の図は、水平タブと改行の効果を示しています。 

printf("Item\tUnit\tPutchase\n\tPrice\tDate\n");

 出力結果:水平タブ文字が8文字になっていることがわかります(出力文字自体も含め、8文字に満たない場合はスペースを4文字追加してください)

 

・「 」を表示したい場合: 

printf("\"Hello!\"");

 出力結果: 

 

 4.scanf関数

*printf と同様に、scanf も特定の形式に従って入力を読み取ります。scanf のフォーマット文字列には、通常の文字と変換命令の 2 つの部分を含めることもできます

*多くの場合、scanf 関数のフォーマット文字列には変換命令のみが含まれます (例: scanf ("%d %d",&i,&j); ユーザーが 1 -2 を入力したと仮定します)

 scanf 関数の機能は、ユーザー入力情報を読み取り、変数 i と j にそれぞれ値 1 ~ 2 を割り当てることです。

*注意すべき点:第 1 に、scanf 関数を使用する場合、変換命令の数が入力変数の数と一致するかどうかを確認し、各変換が変数に対応するかどうかを確認する必要があります。第 2 に、& は通常​​、各変数の前に置かれます。 , 特別な場合(&はアドレスを取得するという意味なので、それ自体がアドレス情報を表す場合)を除いて忘れないように注意してください。

scanf の意味の再解釈 

 scanf 関数は本質的には、入力文字と変換命令を照合しようとする「パターン マッチング」関数です。scanf 関数が呼び出されると、scanf は文字列内の情報を左端から処理します。変換記述ごとに、scanf 関数は一致する項目を見つけ、必要に応じてスペースをスキップします。その後、scanf は Stop に到達するまで入力項目の読み取りを続けます。一致できない文字に達すると読み取りが行われ、残りの文字は読み取りのために次の scanf に渡されます。

非常に紛らわしい例を見てみましょう。 

    int i, j;
	float x, y;
	scanf("%d%d%f%f", &i, &j, &x, &y);
	printf("i=%d,j=%d,x=%f,y=%f", i, j, x, y);

ここでは 1-20.3-4.0e3 と入力します\n

出力結果: 

 

説明する:

*変換の説明 %d: 最初の非 null 入力文字は 1 で、整数は 1 から開始できるため、scanf は下方への読み取りを続けます。- に遭遇すると、scanf は負の符号が整数 %d の変換の説明と一致しないと判断します。なので、i に 1 を格納し、- を戻します。

*変換の説明 %d: 次に、scanf は -、2、0、および . を読み取り、scanf は -20 の整数を正常に読み取り、それを j に格納します。小数点が見つかった場合、変換の説明と一致せず、文字 . は元の位置に戻します。

*変換命令 %f: scanf は、.、3、- 文字を読み取ります。浮動小数点数の後に負符号を付けることはできないため、scanf は x に 0.3 を格納します。-元の場所に戻します。

※変換説明 %f: 最後に、scanf は -、4、.、0、e、3 と改行文字を読み取ります。浮動小数点数には改行文字が含まれないため、scanf は -4.0*10 の 3 乗を y に格納し、改行文字を y に挿入すると、文字は元の場所 (バッファ、次回詳しく紹介します) に戻され、次の scanf 呼び出しまで残されます。

*注意: scanf を使用するときは、形式の一致に注意する必要があります。文字列を読み取るとき、scanf() はスペースが見つかると読み取りを停止します。そのため、scanf() String の場合、「this is test」は 3 になります。別の例: scanf ("%d, %d", &i, &j); では、scanf 関数はまず適切な入力整数を探して i に格納し、次に scanf はカンマと次の入力文字の一致を試みます。次の文字がコンマではなくスペースである場合、scanf 関数は操作を終了し、j の値を読み取らなくなります。

今後もインプットとアウトプットのさらなる解釈を提供していきます。ご質問がございましたら、お気軽にコメント欄でサポートをお願いいたします。

 

 

 

 

 

おすすめ

転載: blog.csdn.net/m0_74475605/article/details/132049500