你怎么連printf都用不來?

打從進(jìn)入IT行業(yè)超過一年刹悴。不幸的是柜蜈,我連printf, scanf都忘了...

一狈邑、printf()

首先我們談?wù)刾rintf(), 學(xué)術(shù)化的講, printf()是格式化輸出函數(shù)政鼠。
printf("<格式化字符串>", <參量表>);

格式化字符串規(guī)定兩部分內(nèi)容:

  1. 正常字符, 按正常輸出。
  2. 格式化規(guī)定字符, 以"%"開始,后跟一個或幾個規(guī)定字符, 用來確定輸出內(nèi)容格式律姨。
格式化字符串的格式是:    
%[標(biāo)志][輸出最小寬度][.精度][長度]格式字符

參量表:
需要輸出的一系列參數(shù), 個數(shù)需要與格式化字符所說名的參數(shù)個數(shù)一樣多, 參數(shù)間用","分開, 且順序?qū)?yīng)振峻。

1. 格式化輸出

一般標(biāo)志字符分為四種, - + # 空格。

字符 含義
- 結(jié)果左對齊, 右邊填空格
+ 輸出符號(正號或負(fù)號)
空格 輸出值為正時冠以空格, 為負(fù)時冠以符號
# 對c, s, d, u類型無影響, 即字符择份、字符串扣孟、十進(jìn)制有符號整數(shù)型、十進(jìn)制無符號整數(shù)型無影響荣赶。<br />o類型, 即無符號八進(jìn)制類型凤价,輸出時前綴為0鸽斟。<br />x類型, 即無符號十六進(jìn)制類型,輸出時前綴為0x利诺。<br />e, f, g類, 即指數(shù)型的浮點數(shù)類型富蓄、浮點數(shù)類型、自動選擇類型時, 只有結(jié)果有小數(shù)時才給出慢逾。

測試函數(shù)

void formatPrintfTest() {
    int i = 12345;
    float j = 678.45;
    printf("format = %d\n", i);      //  正常輸出
    printf("format = %10d\n", i);    //  位數(shù)不足時, 左側(cè)補空格
    printf("format = %-10d\n", i);   //  位數(shù)不足時, 右側(cè)補空格
    
    printf("format = %+d\n", i);     //  輸出時追加前綴正負(fù)號
    
    printf("format = % d\n", i);     //  輸出時正整數(shù)前綴留空格, 負(fù)整數(shù)時前綴留負(fù)號
    
    printf("format = %#o\n", i);     //  輸出無符號八進(jìn)制數(shù), 前綴為0
    printf("format = %#x\n", i);     //  輸出無符號十六進(jìn)制數(shù), 前綴為0x
    
    printf("format = %#f\n", j);     //  浮點數(shù)輸出有小數(shù)點時會顯示
}
格式化字符輸出.png

2. 指定寬度輸出

輸出最小寬度, 使用十進(jìn)制表示時的最少位數(shù)格粪。即少則留空格, 占位。多則正常輸出

測試函數(shù):

void widthPrintfTest() {
    int i = 123;
    printf("width = %2d\n", i);     //  實際位數(shù)大于定義寬度: 按實際輸出
    printf("width = %5d\n", i);     //  實際位數(shù)小于定義寬度: 在左側(cè)補空格
    printf("width = %-5d\n", i);    //  實際位數(shù)小于定義寬度: 負(fù)號, 左對齊, 右側(cè)留空格
    printf("width = %05d\n", i);    //  實際位數(shù)小于定義寬度: 表寬度數(shù)字從0開始, 則右對齊, 左側(cè)補0
    printf("width = %-05d\n", i);   //  無實際意義
}
指定寬度輸出.png

3. 指定長度輸出

長度格式符就分h, l, h表示短整型輸出, l表示長整型輸出

測試函數(shù):

void lengthPrintfTest() {
    int h = 12345678901;
    int i = 1234567890;
    int j = 123456;
    int k = 12345;
    printf("lenth = %hd\n", j); //  可保證輸出正確五位整型數(shù)
    printf("lenth = %hd\n", k); //  可保證輸出正確五位整型數(shù)
    printf("lenth = %ld\n", i); //  可保證輸出正確十位整型數(shù)
    printf("lenth = %ld\n", h); //  可保證輸出正確十位整型數(shù)
}
指定長度輸出.png

4. 指定精度輸出

輸出精度, 以"."開頭, 跟十進(jìn)制整數(shù)描述氛改。
輸出如果是數(shù)字, 則表示小數(shù)位數(shù); 實際位數(shù)大于定義精度, 進(jìn)行四舍五入, 否則追加位數(shù)到精度。
輸入如果是字符, 則表示輸出字符個數(shù); 實際位數(shù)大于定義精度, 進(jìn)行字符截取比伏。

測試函數(shù):

void accuracyPrintfTest() {
    float i = 1234.5678;
    char c[10] = "helloworld";
    printf("accuracy = %.2f\n", i);
    printf("accuracy = %.9f\n", i);
    printf("accuracy = %.3s\n", c);
    printf("accuracy = %.9s\n", c);
}
指定精確度輸出.png

二胜卤、scanf()

相比較printf()是格式化輸出函數(shù), scanf()則是與之對應(yīng)的格式化輸入函數(shù)。
scanf("<格式化字符串>", <地址表>);

相類似的格式化字符串包含三類不同字符:

  1. 格式化說明符, 與printf()中基本相同赁项。
  2. 空白字符, 空白字符的使用會使scanf()函數(shù)在讀操作中略去輸入中的一個或多個空白字符葛躏。
  3. 非空白字符, 一個非空白字符會使scanf()函數(shù)在讀操作時剔除與這個非空白字符相同的字符。

地址表:
地址表讀取是所有變量的地址, 而不是變量本身悠菜。

  • 一般變量, 在變量前加上"&", 輸出時用變量名舰攒。
  • 數(shù)組, 用數(shù)組名就代替了數(shù)組首地址, 輸出時也用數(shù)組名。
  • 指針, 用指針名本身, 不要加上"*", 輸出時也用指針即可悔醋。

1. 格式化輸出

scanf()函數(shù)中是否包含(非)空白字符, 導(dǎo)致輸入格式不同摩窃。

測試函數(shù)

void blankScanfTest() {
    int i, j;
    /*
     此時如果中間定義了",", 輸入的時候需要注意","的輸入
     用戶輸入全英文回車, 輸出均為0。
     用戶輸入123,456回車 ==> i = 123, j = 456
     用戶輸入123456回車 ==> i = 123456, j = 0
     */
    scanf("%d,%d", &i, &j);
    printf("i = %d, j = %d\n", i, j);
}
void blankScanfTest() {
    int i, j;
    /*
     并列的數(shù)據(jù)源輸入需要使用空格隔開, 即下列兩種寫法相同
     要么輸入123回車, 456回車 ==> i = 123, j = 456
     要么輸入123空格456 ==> i = 123, j = 456
     */
    scanf("%d%d", &i, &j);
//    scanf("%d %d", &i, &j);

    printf("i = %d, j = %d\n", i, j);
}

2. 更多使用方法

測試函數(shù):

void moreScanfTest() {
    char c1, c2;
    printf("輸出兩個字符\n");
    /*
     如果輸入A回車, 因為輸入一條語句完畢必須回車, 此時由于回車符仍存在在緩存區(qū),
     故執(zhí)行輸入語句scanf(%c, &c2)后, 變量c2輸出是一空行, 即A回車 ==> c1 = A, c2 = 空行
     如果用戶輸入AB, 輸出c1 = A, c2 = B
     用戶輸入超出兩個字符以上的話, 會截取最前面兩個字符進(jìn)行分配
     */
    scanf("%c", &c1);
    scanf("%c", &c2);
    printf("c1 = %c, c2 = %c\n", c1, c2);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芬骄,一起剝皮案震驚了整個濱河市猾愿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌账阻,老刑警劉巖蒂秘,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異淘太,居然都是意外死亡姻僧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蒲牧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撇贺,“玉大人,你說我怎么就攤上這事冰抢∠匝” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵晒屎,是天一觀的道長喘蟆。 經(jīng)常有香客問我缓升,道長,這世上最難降的妖魔是什么蕴轨? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任港谊,我火速辦了婚禮,結(jié)果婚禮上橙弱,老公的妹妹穿的比我還像新娘歧寺。我一直安慰自己,他們只是感情好棘脐,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布斜筐。 她就那樣靜靜地躺著,像睡著了一般蛀缝。 火紅的嫁衣襯著肌膚如雪顷链。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天屈梁,我揣著相機與錄音嗤练,去河邊找鬼。 笑死在讶,一個胖子當(dāng)著我的面吹牛煞抬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播构哺,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼革答,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曙强?” 一聲冷哼從身側(cè)響起蝗碎,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旗扑,沒想到半個月后蹦骑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡臀防,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年眠菇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袱衷。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捎废,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出致燥,到底是詐尸還是另有隱情登疗,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站辐益,受9級特大地震影響断傲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜智政,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一认罩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧续捂,春花似錦垦垂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矾克,卻和暖如春页慷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聂渊。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留四瘫,地道東北人汉嗽。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像找蜜,于是被迫代替她去往敵國和親饼暑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容