一、序言 C++的cin和cout實在是太慢了,所以一直用的都是scanf和printf進行輸入和輸出,但是,最近又發現scanf和printf在數據量大的時候還是太慢了,於是只能手寫輸入輸出優化。但scanf和printf的輸入輸出功能非常強大,所以還是全面學習了一下,這裡寫點總結。 二、格式化說明符 符號 意義 %d 十進制帶符號整數 %u 十進制無符號整數 %o 八進制無符號整數 %x 十六進制無符號整數 %f 十進制小數形式浮點數,無域寬時帶6位小數 %e 十進制科學計數法形式浮點數 %g 十進制小數形式和科學計數法形式中較短的一個 %c 單個字符 %s 字符數組 %p 指針的地址 二、scanf 格式化輸入函數,從標准輸入設備讀取輸入的信息,調用格式:( ”< 格式 >”,< 地址 > ); 格式:% [標志字符] [域寬] [長度] 格式化說明符(中括號內為可選項) 標志字符: *( 讀入後不賦給任何變量,即跳過輸入值 ) 域寬: 實際位數多於域寬則截取域寬長度,剩余部分仍留在標准輸入中等待下次輸入實際位數少於域寬則無效果 長度: 分為h,l( 以下因不同編譯器可能不同 ) h表示按短型讀入( 短整型,單精度型 ) l表示按長型讀入( 整形 == 長整型,雙精度型 == 長雙精度型 ) 其它: 若不屬於上面任何一種情況,則按格式進行對照忽略,即若%d與%d之間出現了“,”,輸入將忽略緊夾在兩個整數間 的“,”,若整數間含有兩個“,”,則在格式中需打兩個“,”;不同的是,若為空格,也會進行忽略,但是會忽略掉中間 的所有的空格或空行。當讀入的整數、浮點數、字符串時無需在格式中加空格也可以自動忽略空格或空行。 地址:需要讀入參量的地址,不是變量本身 一般變量: 變量名前加取地址符號“&” 字符數組: 數組名就表示數組的首地址,無需加取地址符號 指針變量: 指針名就是地址,無需加“*” 三、printf 格式化輸出函數,將信息輸出到標准輸出設備,調用格式:( ”< 格式 >”,< 參量 > ) 格式:% [標志字符] [域寬] [精度] [長度] 格式化說明符(中括號內為可選項) 標志字符: -( 結果左對齊,不夠域寬時右邊填空格 ) +( 不管正負號都輸出符號 ) ( “空格”,正號顯示空格,符號輸出符號 ) #( 輸出%o時加八進制前綴0,輸出%x時加十六進制前綴0x ) 域寬: 實際位數多於域寬按實際位數輸出( 小數點等也算位數,下同 )實際位數少於域寬則在域寬內靠右,左邊留空,若前 有標志字符“-”則反之表示域寬的數字以0開頭,則在實際位數少於域寬時靠右,左邊補滿前導零 精度: 以“.”開頭,後跟十進制整數對於浮點數,表示小數位數,實際位數更多,則四捨五入,更少則在後添零對於字符數 組,表示長度,若實際長度更多,截取前一部分,更少無效果 長度: 分為h,l( 以下因不同編譯器可能不同 ) h表示按短型輸出( 短整型,單精度型 ) l表示按長型輸出( 整形 == 長整型,雙精度型 == 長雙精度型 ) 其它: 若不屬於上面任何一種情況,包括出現未提及的字符,或者是未按照一定順序,比如“空格”未直接跟在了“%”後面而是 出現在了格式化說明符後,將按照原樣輸出 參量:需要輸出參量的值,不是地址 一般變量: 直接打變量名,前面不加取地址符號 字符數組: 直接打數組名,告訴程序需要輸出的開始位置 指針變量: 在指針名前加指向標志“*” 四、優化 在數據量特別大,比如需要輸入或者輸出1000萬個整數的時候,scanf和printf就會變得非常慢,然而getchar和putchar函數很快,所以我們需要用其來優化讀入與輸出。 讀入優化: [cpp] // 優化前讀入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; } 輸出優化: [cpp] www.2cto.com // 優化前輸出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 ); } 注意:既然是優化就要盡量優化,少帶參才是時間的王道! 備注:若有錯誤,請留言告知,感激不盡。