c/c++scanf printfの使い方と最適化


一、はじめに
        
C++のcinとcoutは本当に遅いので、ずっとscanfとprintfで入力と出力をしていましたが、最近はscanfとprintfがデータ量が大きいときに遅すぎることに気づき、手書きで入力出力を最適化するしかありません.しかしscanfとprintfの入出力機能は非常に強いので、全面的に勉強して、ここでまとめを書きます.
 
二、フォーマット説明子
   
アイコン
意味
        %d        
10進符号付き整数
%u
10進符号なし整数
%o
8進符号なし整数
%x
16進符号なし整数
%f
10進数小数形浮動小数点数、無域幅時帯6桁小数
%e
十進法科学カウント法形式浮動小数点数
%g
10進数小数形と科学カウント法の形式の中で短い1つ
%c
単一文字
%s
文字配列
%p
ポインタのアドレス
 
三、scanf
        
入力関数をフォーマットし、標準入力装置から入力情報を読み出し、フォーマットを呼び出します:("<フォーマット>"、<アドレス>);
書式:%[フラグ文字][ドメイン幅][長さ]フォーマット説明子(中かっこ内はオプション)
フラグ文字:
*(読み込み後は変数を割り当てず、入力値をスキップ)
ドメイン幅:
実際のビット数がドメイン幅より多い場合、ドメイン幅の長さを切り取り、残りの部分は標準入力に残って次の入力を待つ.実際のビット数がドメイン幅より少ないと効果がありません
長さ:
h,lに分ける(以下、コンパイラによって異なる場合がある)
hは、短型で読み込む(短型、単精度型)を表す
lは、長型で読み込む(整形==長整型、二重精度型==長二重精度型)
その他:
いずれにも該当しない場合は、フォーマットに従って無視します.すなわち、%dと%dの間に「,」が表示された場合、入力は無視されて2つの整数間に挟まれます.
の「,」,整数の間に2つの「,」が含まれている場合は,フォーマットに2つの「,」;違いは、スペースであれば無視されますが、真ん中は無視されます
の双曲線コサインを返します.整数、浮動小数点数、文字列を読み込むと、フォーマットにスペースを追加する必要がなく、スペースや空の行を自動的に無視できます.
アドレス:変数自体ではなくパラメータを読み込む必要があるアドレス
一般変数:
変数名にアドレス記号「&」を付ける
文字配列:
配列名は配列の先頭アドレスを表し、アドレス記号を付ける必要はありません
ポインタ変数:
ポインタ名はアドレスで、「*」を付ける必要はありません.
 
四、printf
        
出力関数をフォーマットし、標準出力デバイスに情報を出力し、フォーマットを呼び出します:("<フォーマット>"、<パラメータ>)
書式:%[フラグ文字][ドメイン幅][精度][長さ]フォーマット説明子(中かっこ内はオプション)
フラグ文字:
-(結果が左揃えで、ドメイン幅が足りない場合は右にスペースを入力)
+(プラスとマイナスを問わず記号を出力)
(「スペース」、正の記号はスペースを表示し、記号は記号を出力します)
#(出力%oに8進プレフィックス0、出力%xに16進プレフィックス0 x)
ドメイン幅:
実際の桁数がドメイン幅より多い場合は実際の桁数で出力(小数点なども桁数、以下同じ)し、実際の桁数がドメイン幅より少ない場合はドメイン幅内を右にし、左側を空ける
前にフラグ文字「-」がある場合は逆
ドメイン幅を表す数字は0で始まると、実際の桁数がドメイン幅より少ない場合は右側、左側は先頭ゼロを埋め尽くす
精度:
をもって先頭、後に10進数の整数
浮動小数点数については、小数点数を表し、実際の桁数がもっと多い場合は四捨五入し、より少ない場合は後にゼロを加算する
文字配列については、長さを表し、実際の長さがもっと多い場合は、前の部分を切り取り、効果がありません.
長さ:
h,lに分ける(以下、コンパイラによって異なる場合がある)
hは、短型出力(短整型、単精度型)
l長型出力(整形==長整型、二重精度型==長二重精度型)
その他:
上記のいずれにも該当しない場合は、未記載の文字が表示された場合や、スペースが「%」の後に直接付いていない場合など、一定の順序に従っていない場合があります.
フォーマットされた説明子が表示されると、そのまま出力されます.
≪パラメータ|Parameters|ldap≫:パラメータの値を出力する必要があります.アドレスではありません.
一般変数:
直接変数名を打って、前はアドレス記号をつけません
文字配列:
直接配列名を打って、プログラムに出力する必要がある開始位置を教えます
ポインタ変数:
ポインタ名にポインタ"*"を付ける
 
五、最適化
        
1000万個の整数を入力したり出力したりするなど、データ量が特に大きい場合、scanfとprintfは非常に遅くなりますが、getcharとputchar関数は速いので、読み込みと出力を最適化する必要があります.
読み込み最適化:
//      1-10000000:3.176 
//      1-10000000:1.232 

void scan( )
{
    k = num = 0, bit = 1;
    while( ( ch[++num] = getchar( ) ) != 32 );
    num--;
    while( num ) k += ( ch[num--]-48 )*bit, bit *= 10;
}

出力の最適化:
//      1-10000000:4.336 
//      1-10000000:1.897 

void print( int k )
{
    num = 0;
    while( k > 0 ) ch[++num] = k % 10, k /= 10;
    while( num ) 
        putchar( ch[num--]+48 );
    putchar( 32 );
}

注意:最適化である以上、できるだけ最適化しなければならない. 
備考:間違いがあったら、伝言を残してください.感謝しています.