一、彙總前面學過的格式控制符
格式控制符 | 說明 |
---|---|
%c | 輸出一個單一的字符 |
%hd、%d、%ld | 以十進制、有符號的形式輸出 short、int、long 類型的整數 |
%hu、%u、%lu | 以十進制、無符號的形式輸出 short、int、long 類型的整數 |
%ho、%o、%lo | 以八進制、不帶前綴、無符號的形式輸出 short、int、long 類型的整數 |
%#ho、%#o、%#lo | 以八進制、帶前綴、無符號的形式輸出 short、int、long 類型的整數 |
%hx、%x、%lx %hX、%X、%lX |
以十六進制、不帶前綴、無符號的形式輸出 short、int、long 類型的整數。如果 x 小寫,那麼輸出的十六進制數字也小寫;如果 X 大寫,那麼輸出的十六進制數字也大寫。 |
%#hx、%#x、%#lx %#hX、%#X、%#lX |
以十六進制、帶前綴、無符號的形式輸出 short、int、long 類型的整數。如果 x 小寫,那麼輸出的十六進制數字和前綴都小寫;如果 X 大寫,那麼輸出的十六進制數字和前綴都大寫。 |
%f、%lf | 以十進制的形式輸出 float、double 類型的小數 |
%e、%le %E、%lE |
以指數的形式輸出 float、double 類型的小數。如果 e 小寫,那麼輸出結果中的 e 也小寫;如果 E 大寫,那麼輸出結果中的 E 也大寫。 |
%g、%lg %G、%lG |
以十進制和指數中較短的形式輸出 float、double 類型的小數,並且小數部分的最後不會添加多餘的 0。如果 g 小寫,那麼當以指數形式輸出時 e 也小寫;如果 G 大寫,那麼當以指數形式輸出時 E 也大寫。 |
%s | 輸出一個字符串 |
二、printf用法
2.1 長度控制
(1)width表示最小輸出寬度,'-'表示左對齊,不加是右對齊。
#include <stdio.h>
int main()
{
int a1=20, a2=345, a3=700, a4=22;
int b1=56720, b2=9999, b3=20098, b4=2;
int c1=233, c2=205, c3=1, c4=6666;
int d1=34, d2=0, d3=23, d4=23006783;
printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4);
printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
printf("%-9d %-9d %-9d %-9d\n", c1, c2, c3, c4);
printf("%-9d %-9d %-9d %-9d\n", d1, d2, d3, d4);
return 0;
}
m 是正數,以%+d
輸出時要帶上正號;n 是負數,以+d
輸出時要帶上負號。
m 是正數,以% d
輸出時要在前面加空格;n 是負數,以% d
輸出時要在前面加負號。
%.0f
表示保留 0 位小數,也就是隻輸出整數部分,不輸出小數部分。默認情況下,這種輸出形式是不帶小數點的,但是如果有了#
標誌,那麼就要在整數的後面“硬加上”一個小數點,以和純整數區分開。
#include <stdio.h>
int main(){
int m = 192, n = -943;
float f = 84.342;
printf("m=%10d, m=%-10d\n", m, m); //演示 - 的用法
printf("m=%+d, n=%+d\n", m, n); //演示 + 的用法
printf("m=% d, n=% d\n", m, n); //演示空格的用法
printf("f=%.0f, f=%#.0f\n", f, f); //演示#的用法
return 0;
}
輸出結果:
m= 192, m=192 m=+192, n=-943 m= 192, n=-943 f=84, f=84.
(2)精度長度控制
.precision 表示輸出精度,也就是小數的位數。
- 當小數部分的位數大於 precision 時,會按照四捨五入的原則丟掉多餘的數字;
- 當小數部分的位數小於 precision 時,會在後面補 0。
另外,.precision 也可以用於整數和字符串,但是功能卻是相反的:
- 用於整數時,.precision 表示最小輸出寬度。與 width 不同的是,整數的寬度不足時會在左邊補 0,而不是補空格。
- 用於字符串時,.precision 表示最大輸出寬度,或者說截取字符串。當字符串的長度大於 precision 時,會截掉多餘的字符;當字符串的長度小於 precision 時,.precision 就不再起作用。
#include <stdio.h>
int main(){
int n = 123456;
double f = 882.923672;
char *str = "abcdefghi";
printf("n: %.9d %.4d\n", n, n);
printf("f: %.2lf %.4lf %.10lf\n", f, f, f);
printf("str: %.5s %.15s\n", str, str);
return 0;
}
/*
運行結果:
n: 000123456 123456
f: 882.92 882.9237 882.9236720000
str: abcde abcdefghi
*/
關於printf()的輸出,要注意一下緩衝區問題。
Linux和Mac OS下數據不直接輸出,沒有\n就先放到緩衝區,不顯示,遇到\n顯示,Windows下不是。
2.2 在屏幕的任何位置輸出數據
光標定位需要使用 windows.h 頭文件中的SetConsoleCursorPosition
函數,它的使用方式爲:
SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD dwCursorPosition);
hConsoleOutput
表示控制檯緩衝區句柄,可通過GetStdHandle(STD_OUTPUT_HANDLE)
來獲得;dwCursorPosition
是光標位置,也就是第幾行第幾列,它是 COORD 類型的結構體。
例如,將光標定位到控制檯的第3行第3列:
#include <stdio.h>
#include <windows.h>
int main(){
//定義光標位置
COORD coord;
coord.X = 3; //第3行
coord.Y = 3; //第3列
//獲取控制檯緩衝區句柄
HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
//設置光標位置
SetConsoleCursorPosition(ConsoleHandle, coord);
printf("123");
return 0;
}
注意:窗口的左上角是第 0 行第 0 列,而不是我們通常所認爲的第 1 行第 1 列。編程語言中的很多計數都是從 0 開始的,而不是從 1 開始。
搞定了光標重定位,你就可以將輸出順序打亂了,想在哪裏輸出就在哪裏輸出。例如:
#include <stdio.h>
#include <windows.h>
//設置光標位置
void setCursorPosition(int x, int y);
//設置文字顏色
void setColor(int color);
int main(){
setColor(3);
setCursorPosition(3, 3);
puts("★");
setColor(0XC);
setCursorPosition(1, 1);
puts("◆");
setColor(6);
setCursorPosition(6, 6);
puts("■");
return 0;
}
//自定義的光標定位函數
void setCursorPosition(int x, int y){
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//自定義的文字顏色函數
void setColor(int color){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) ;
}
運行結果:
三、輸入用法
在C語言中,有多個函數可以從鍵盤獲得用戶輸入:
- scanf():和 printf() 類似,scanf() 可以輸入多種類型的數據。
- getchar()、getche()、getch():這三個函數都用於輸入單個字符。
- gets():獲取一行數據,並作爲字符串處理。
scanf() 是最靈活、最複雜、最常用的輸入函數,但它不能完全取代其他函數,大家都要有所瞭解。
3.1 scanf()函數
scanf格式化掃描輸入。注意"%d %d"
之間是有空格的,所以輸入數據時也要有空格。scanf() 對輸入數據之間的空格的處理比較寬鬆,並不要求空格數嚴格對應,多幾個少幾個無所謂,只要有空格就行。。對於 scanf(),輸入數據的格式要和控制字符串的格式保持一致。
%p
是一個新的格式控制符,它表示以十六進制的形式(帶小寫的前綴)輸出數據的地址。如果寫作%P
,那麼十六進制的前綴也將變成大寫形式。
#include <stdio.h>
int main()
{
int a='F';
int b=12;
int c=452;
printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);
return 0;
}
注意一下這個代碼及相對應的輸入:
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d", &a, &b);
printf("a+b=%d\n", a+b);
scanf("%d %d", &a, &b);
printf("a+b=%d\n", a+b);
scanf("%d, %d, %d", &a, &b, &c);
printf("a+b+c=%d\n", a+b+c);
//劃重點下面這部分。
scanf("%d is bigger than %d", &a, &b);
printf("a-b=%d\n", a-b);
return 0;
}
運行結果:
10 20↙ a+b=30 100 200↙ a+b=300 56,45,78↙ a+b+c=179 25 is bigger than 11↙ a-b=14