打從進(jìn)入IT行業(yè)超過一年刹悴。不幸的是柜蜈,我連printf, scanf都忘了...
一狈邑、printf()
首先我們談?wù)刾rintf(), 學(xué)術(shù)化的講, printf()是格式化輸出函數(shù)政鼠。
printf("<格式化字符串>", <參量表>);
格式化字符串規(guī)定兩部分內(nèi)容:
- 正常字符, 按正常輸出。
- 格式化規(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ù)點時會顯示
}
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); // 無實際意義
}
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ù)
}
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);
}
二胜卤、scanf()
相比較printf()是格式化輸出函數(shù), scanf()則是與之對應(yīng)的格式化輸入函數(shù)。
scanf("<格式化字符串>", <地址表>);
相類似的格式化字符串包含三類不同字符:
- 格式化說明符, 與printf()中基本相同赁项。
- 空白字符, 空白字符的使用會使scanf()函數(shù)在讀操作中略去輸入中的一個或多個空白字符葛躏。
- 非空白字符, 一個非空白字符會使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);
}