formatting i o printf
このチュートリアルでは、C ++での入出力のフォーマットに使用されるprintf、sprintf、scanfなどの関数の使用法と例について説明します。
以前のC ++チュートリアルでは、cin / coutを使用してC ++で入出力操作を実行できることを確認しました。
これらのコンストラクトを使用する以外に、Cライブラリを使用することもできます。 C標準入出力ライブラリ(cstdio、C言語のstdio.hヘッダーに相当するC ++)を使用して、キーボード(標準入力)、プリンター、端末(標準出力)などの物理デバイスで動作する「ストリーム」を使用してI / O操作を実行します。 )またはオペレーティングシステムでサポートされているその他のファイルタイプ。
=> ここで詳細なC ++トレーニングチュートリアルを確認してください。
ストリームは、物理デバイスと均一に対話するために使用される抽象的なエンティティに他なりません。すべてのストリームは同様の特性を持ち、物理メディアデバイスから独立しています。
このチュートリアルの次のトピックでは、printf、sprint、scanfなどのいくつかの関数について詳しく学習します。
学習内容:
C ++ printf
C ++のprintf関数は、stdoutにフォーマットされた出力を書き込むために使用されます。
関数プロトタイプ:
int printf(const char * format、…);
パラメーター:
フォーマット=> ファイルストリームに書き込まれるnullで終了する文字列へのポインタ。これは、%で始まるオプションのフォーマット指定子とともに文字で構成されます。フォーマット指定子は、フォーマット文字列に続く適切な値に置き換えられます。
…=> フォーマットが指定された順序で印刷されるデータを指定するその他の追加の引数。
戻り値:
Windows10用の最高の無料スクリーンショットソフトウェア
成功=> printfは、返された文字数を返します。
失敗=> 負の値
説明:
printf関数はヘッダーで定義されています。 printf関数は、「format」ポインタが指す文字列を標準出力stdoutに書き込みます。フォーマット文字列にはフォーマット指定子が含まれている場合があり、フォーマット指定子は、追加の引数として(フォーマット文字列の後に)printf関数に渡される変数に置き換えられます。
printf()関数で使用されるフォーマット指定子
フォーマット指定子の一般的な形式は次のとおりです。
%(flags)(width)(.precision)(length)specifier以下に、フォーマット指定子の各部分の説明を示します。
- %記号: これは先頭の%記号です
- フラグ: それらは次の値を持つことができます:
- –:フィールド内の結果を左揃えにします。デフォルトでは、右寄せ。
- +:肯定的な結果を含む値の先頭に付けられた結果の符号。
- スペース:記号がない場合、結果の先頭にスペースが付加されます。
- #:別の形式の変換を指定します。
- 0:整数および浮動小数点数に使用されます。スペースがない場合は、先行ゼロとして機能します。
- 幅: 最小フィールド幅を*または整数値の形式で指定します。これはオプションです。
- 精度: 精度を「。」の後に*または整数または何も付けずに指定します。これもオプションです。
- 長さ: 引数のサイズを指定したオプションの引数。
- 指定子: これは変換フォーマット指定子です。
C ++で使用されるさまざまなフォーマット指定子は次のとおりです。
| しない | 指定子 | 説明 |
|---|---|---|
| 7 | u | 符号なし整数を10進表現に変換します。 |
| 1 | % | %を出力します。 |
| 二 | c | 1文字を印刷します。 |
| 3 | s | 文字列を出力します。 |
| 4 | d / i | 符号付き整数を10進表現に変換します。 |
| 5 | または | 符号なし整数を8進表現に変換します。 |
| 6 | x / X | 符号なし整数を16進表現に変換します。 |
| 8 | f / F | 浮動小数点数を10進表現に変換します。 |
| 9 | および/ E | 浮動小数点数を10進指数表記に変換します。 |
| 10 | a / A | 浮動小数点数を16進指数に変換します。 |
| 十一 | g / G | 浮動小数点数を10進数または10進数の指数表記に変換します。 |
| 12 | n | この関数呼び出しによってこれまでに書き込まれた文字数。 |
| 13 | p | 実装で定義された文字シーケンスを指すポインター。 |
以下に示すのは、上記で説明したprintf関数を示す完全なC ++プログラミングの例です。
C ++ printfの例
#include //C++ printf example int main() { char ch = 'A'; float a = 8.0, b = 3.0; double d = 3.142; int x = 20; printf('float division : %.3f / %.3f = %.3f
', a,b,a/b); printf('Double value: %.4f
', d); printf('Setting width %*c
',4,ch); printf('Octal equivalent of %d is %o
',x,x); printf('Hex equivalent of %d is %x
',x,x); return 0; }出力:

上記のプログラムはprintf関数へのさまざまな呼び出しを使用し、printfへの各呼び出しは上記で説明したさまざまなフォーマット指定子を使用することに注意してください。フォーマット指定子%.3fは、小数点以下3桁までの浮動小数点値を示します。残りのprintf呼び出しは、文字、10進数、8進数、および16進数の値を表示します。
C ++ sprintf
C ++のSprintf関数は、printf関数と似ていますが、1つ違いがあります。 sprintfは、出力を標準出力stdoutに書き込む代わりに、出力を文字列バッファーに書き込みます。
関数プロトタイプ:
int sprintf(char *バッファ、const char *形式、…)
パラメーター:
バッファ=> 結果が書き込まれる文字列バッファへのポインタ。
フォーマット=> ファイルストリームに書き込まれるnullで終了する文字列へのポインタ。
注:sprintf関数で使用されるフォーマット文字列は、printf関数の説明の一部として説明されているものと同じです。
…=> フォーマットが指定された順序で印刷されるデータを指定するその他の追加の引数。
戻り値:
成功=> 終了ヌル文字を除いて、十分に大きいバッファーに書き込まれた文字数を返します。
失敗=> 負の値が返されます。
説明:
Sprintf関数はヘッダーで定義されています。 sprintf関数は、フォーマットが指す文字列を文字列バッファに書き込むために使用されます。文字列フォーマットには、%で始まるフォーマット指定子を含めることができます。これらの指定子は、追加の引数としてsprintf()関数に渡される変数の値に置き換えられます。
sprintf関数の使用法を示すC ++プログラムの例を見てみましょう。
sprintfの例
#include #include using namespace std; int main() { char mybuf(100); int retVal; char name() = 'Software Testing Help'; char topic() = 'C++ tutorials'; retVal = sprintf(mybuf, 'Hi, this is %s and you are reading %s !!', name, topic); cout << mybuf << endl; cout << 'Number of characters written = ' << retVal << endl; return 0; }出力:

上記の例では、最初に、sprintf関数を使用してフォーマットされた文字列を文字バッファmybufに書き込みます。次に、coutを使用して文字列をstdoutに表示します。最後に、mybufバッファーに書き込まれた文字数を表示します。
C ++ scanf
C ++のscanf関数は、標準入力stdinから入力データを読み取ります。
関数プロトタイプ:
int scanf(const char *形式、…)
パラメーター:
フォーマット=> 入力の読み取り方法を定義するnullで終了する文字列へのポインタ。このフォーマット文字列は、フォーマット指定子で構成されています。
…=> データ入力を受け取る追加の引数。これらの追加の引数は、フォーマット指定子に従って順番に並んでいます。
戻り値:
成功=> 読み込まれた文字数を返します。
matchingFailure => 最初の受信引数が割り当てられる前にマッチングの失敗が発生した場合、ゼロを返します。
入力失敗=> 最初の受信引数が割り当てられる前に入力エラーが発生した場合、EOFを返します。
説明:
Scanf()関数はヘッダーで定義されています。この関数は、stdinからデータを読み取り、提供された変数に格納します。
scanf()関数で使用されるフォーマット指定子
scanf()関数のフォーマット文字列の一般的なフォーマットは次のとおりです。
%(*)(width)(length)specifierしたがって、フォーマット指定子には次の部分があります。
- 空白以外の文字: これらは、入力ストリームから1つの同一文字を消費する%以外の文字です。
- 空白文字: 連続するすべての空白文字は、1つの空白文字と見なされます。同じことがエスケープシーケンスにも当てはまります。
- 変換仕様: 次の形式です。
- %: 始まりを指定する文字。
- *: 代入抑制文字と呼ばれます。存在する場合、scanfは結果を受信パラメーターに割り当てません。このパラメーターはオプションです。
- フィールド幅: 最大フィールド幅を指定するオプションのパラメーター(正の整数)。
- 長さ: 引数を受け取るサイズを指定します。
変換フォーマット指定子は次のようになります。
| しない | フォーマット指定子 | 説明 |
|---|---|---|
| 7 | x / X | 符号なし16進整数に一致します。 |
| 1 | % | リテラル%に一致します。 |
| 二 | c | 幅までの単一文字または複数文字に一致します。 |
| 3 | s | 指定された幅または最初の空白まで、非空白文字のシーケンスに一致します。 |
| 4 | d | 10進数に一致します。 |
| 5 | 私 | 整数に一致します。 |
| 6 | または | 符号なし8進整数に一致します。 |
| 8 | u | 符号なし10進整数に一致します。 |
| 9 | a / A、e / E、f / F、g / G | 浮動小数点数に一致します。 |
| 10 | (セットする) | 指定されたセットの空でない文字シーケンスに一致します。 ^が前に付いている場合、セットにない文字が一致します。 |
| 12 | n | これまでに読み取った文字数を返します。 |
| 13 | p | 実装固有の文字シーケンスへのポインタ。 |
次に、C ++でのscanf関数の使用法を示すサンプルプログラムを実装します。
scanfの例
#include int main () { char str (80), pos_str(80); int i; printf ('Enter your company name: '); scanf ('%79s',str); printf ('Enter your position: '); scanf ('%s',pos_str); printf ('You work at %s as %s.
',str,pos_str); printf ('Enter a hexadecimal number: '); scanf ('%x',&i); printf ('You have entered %#x (%d).
',i,i); return 0; }出力:

上記のプログラムでは、2つの入力文字列と16進数を読み取ります。次に、2つの文字列を組み合わせて、結果の文字列を表示します。数値は10進数に変換されて表示されます。
scanf / printf Vs. C ++のcin / cout
| scanf / printf | cin /コスト |
|---|---|
| C言語の標準入出力。 | C ++言語での標準入出力。 |
| 'stdio.h'で定義されています。 | 'iostream'で定義されています。 |
| scanfとprintfは、I / Oに使用される関数です。 | cinとcoutはストリームオブジェクトです。 |
| フォーマット文字列は、入力と出力のフォーマットに使用されます。 | 演算子>>および<< are overloaded and used along with cin and cout respectively. フォーマット文字列は使用されません。 |
| プレースホルダーを使用してデータの種類を指定します。 | データ型を指定する必要はありません。 |
よくある質問
Q#1)C ++でprintfを使用できますか?
回答: はい。 PrintfはC ++で使用できます。この関数をC ++プログラムで使用するには、プログラムにヘッダーを含める必要があります。
Q#2)どの言語がprintfを使用していますか?
回答: Printfは、C言語の標準出力関数です。また、C ++プログラムにヘッダーを含めることにより、C ++言語で使用することもできます。
Q#3)Cプログラミングの%dとは何ですか?
回答: printf関数の%d値は整数値を参照します。
Q#4)Scanfで&が使用されるのはなぜですか?
回答: &演算子は、メモリ位置にアクセスするために使用されます。変数を明示的に渡すのではなく、変数へのポインターを渡すのは省略形です。
Q#5)printf()とsprintf()の違いは何ですか?
回答: 関数printf()とsprintf()は、1つの違いを除いて同じです。 printf()は出力をstdout(標準出力)に書き込みますが、sprintfは出力を文字列バッファーに書き込みます。
Q#6)Sprintf nullは終了しますか?
回答: sprintfは、null終了文字を除く文字列配列に格納されている文字数を返します。
Q#7)sprintfが安全でないのはなぜですか?
回答: Sprintf関数は、宛先バッファーの長さをチェックしません。したがって、フォーマット文字列の長さが長すぎると、関数によって宛先バッファのオーバーフローが発生する可能性があります。これにより、アプリケーションが不安定になり、セキュリティの問題が発生し、sprintf関数が安全でなくなる可能性があります。
結論
このチュートリアルでは、Cヘッダーと同等のヘッダーを含めることでC ++で使用できるCライブラリの入出力関数(printf、sprintf、scanf)について学習しました。
すでに説明したように、入出力関数はフォーマット指定子とプレースホルダーを使用しており、データの読み取りまたは書き込みが行われる変数のデータ型を指定する必要があります。
これとは異なり、C ++ – cinおよびcoutで使用されるストリーミングオブジェクトは、形式指定子またはプレースホルダーを使用しません。それらはオーバーロードされた>>とを使用します<< operators to read in and write the data.
=> ここで完璧なC ++トレーニングガイドをチェックしてください。