printf函數
- printf函數稱之為格式輸出函數,方法名稱的最後一個字母f表示format。其功能是按照使用者指定的格式,把指定的資料輸出到螢幕上
- printf函數的調用格式為:
-
printf("格式控制字元串",輸出項清單 );
- 例如:
printf("a = %d, b = %d",a, b);
- 非格式字元串原樣輸出, 格式控制字元串會被輸出項清單中的資料替換
- 注意: 格式控制字元串和輸出項在數量和類型上必須一一對應
-
- 格式控制字元串
- 形式:
%[标志][輸出寬度][.精度][長度]類型
- 形式:
- 類型
- 格式:
printf("a = %類型", a);
- 類型字元串用以表示輸出資料的類型, 其格式符和意義如下所示
- 格式:
含義 | |
---|---|
d | 有符号10進制整型 |
i | |
u | 無符号10進制整型 |
o | 無符号8進制整型 |
x | 無符号16進制整型 |
X | |
f | 單、雙精度浮點數(預設保留6位小數) |
e / E | 以指數形式輸出單、雙精度浮點數 |
g / G | 以最短輸出寬度,輸出單、雙精度浮點數 |
c | 字元 |
s | 字元串 |
p | 位址 |
#include <stdio.h>
int main(){
int a = 10;
int b = -10;
float c = 6.6f;
double d = 3.1415926;
double e = 10.10;
char f = 'a';
// 有符号整數(可以輸出負數)
printf("a = %d\n", a); // 10
printf("a = %i\n", a); // 10
// 無符号整數(不可以輸出負數)
printf("a = %u\n", a); // 10
printf("b = %u\n", b); // 429496786
// 無符号八進制整數(不可以輸出負數)
printf("a = %o\n", a); // 12
printf("b = %o\n", b); // 37777777766
// 無符号十六進制整數(不可以輸出負數)
printf("a = %x\n", a); // a
printf("b = %x\n", b); // fffffff6
// 無符号十六進制整數(不可以輸出負數)
printf("a = %X\n", a); // A
printf("b = %X\n", b); // FFFFFFF6
// 單、雙精度浮點數(預設保留6位小數)
printf("c = %f\n", c); // 6.600000
printf("d = %lf\n", d); // 3.141593
// 以指數形式輸出單、雙精度浮點數
printf("e = %e\n", e); // 1.010000e+001
printf("e = %E\n", e); // 1.010000E+001
// 以最短輸出寬度,輸出單、雙精度浮點數
printf("e = %g\n", e); // 10.1
printf("e = %G\n", e); // 10.1
// 輸出字元
printf("f = %c\n", f); // a
}
- 寬度
-
printf("a = %[寬度]類型", a);
- 用十進制整數來指定輸出的寬度, 如果實際位數多于指定寬度,則按照實際位數輸出, 如果實際位數少于指定寬度則以空格補位
-
#include <stdio.h>
int main(){
// 實際位數小于指定寬度
int a = 1;
printf("a =|%d|\n", a); // |1|
printf("a =|%5d|\n", a); // | 1|
// 實際位數大于指定寬度
int b = 1234567;
printf("b =|%d|\n", b); // |1234567|
printf("b =|%5d|\n", b); // |1234567|
}
- 标志
-
printf("a = %[标志][寬度]類型", a);
-
- | 左對齊, 預設右對齊 |
+ | 當輸出值為正數時,在輸出值前面加上一個+号, 預設不顯示 |
右對齊時, 用0填充寬度.(預設用空格填充) | |
空格 | 輸出值為正數時,在輸出值前面加上空格, 為負數時加上負号 |
# | 對c、s、d、u類型無影響 |
對o類型, 在輸出時加字首o | |
對x類型,在輸出時加字首0x |
#include <stdio.h>
int main(){
int a = 1;
int b = -1;
// -号标志
printf("a =|%d|\n", a); // |1|
printf("a =|%5d|\n", a); // | 1|
printf("a =|%-5d|\n", a);// |1 |
// +号标志
printf("a =|%d|\n", a); // |1|
printf("a =|%+d|\n", a);// |+1|
printf("b =|%d|\n", b); // |-1|
printf("b =|%+d|\n", b);// |-1|
// 0标志
printf("a =|%5d|\n", a); // | 1|
printf("a =|%05d|\n", a); // |00001|
// 空格标志
printf("a =|% d|\n", a); // | 1|
printf("b =|% d|\n", b); // |-1|
// #号
int c = 10;
printf("c = %o\n", c); // 12
printf("c = %#o\n", c); // 012
printf("c = %x\n", c); // a
printf("c = %#x\n", c); // 0xa
}
- 精度
-
printf("a = %[精度]類型", a);
- 精度格式符以"."開頭, 後面跟上十進制整數, 用于指定需要輸出多少位小數, 如果輸出位數大于指定的精度, 則删除超出的部分
-
#include <stdio.h>
int main(){
double a = 3.1415926;
printf("a = %.2f\n", a); // 3.14
}
- 動态指定保留小數位數
-
printf("a = %.*f", a);
-
#include <stdio.h>
int main(){
double a = 3.1415926;
printf("a = %.*f", 2, a); // 3.14
}
- 實型(浮點類型)有效位數問題
- 對于單精度數,使用%f格式符輸出時,僅前6~7位是有效數字
- 對于雙精度數,使用%lf格式符輸出時,前15~16位是有效數字
- 有效位數和精度(保留多少位)不同, 有效位數是指從第一個非零數字開始,誤差不超過本數位半個機關的、精确可信的數位
- 有效位數包含小數點前的非零數位
#include <stdio.h>
int main(){
// 1234.567871093750000
float a = 1234.567890123456789;
// 1234.567890123456900
double b = 1234.567890123456789;
printf("a = %.15f\n", a); // 前8位數字是準确的, 後面的都不準确
printf("b = %.15f\n", b); // 前16位數字是準确的, 後面的都不準确
}
- 長度
-
printf("a = %[長度]類型", a);
-
修飾類型 | ||
---|---|---|
hh | d、i、o、u、x | 輸出char |
h | 輸出 short int | |
l | 輸出 long int | |
ll | 輸出 long long int |
#include <stdio.h>
int main(){
char a = 'a';
short int b = 123;
int c = 123;
long int d = 123;
long long int e = 123;
printf("a = %hhd\n", a); // 97
printf("b = %hd\n", b); // 123
printf("c = %d\n", c); // 123
printf("d = %ld\n", d); // 123
printf("e = %lld\n", e); // 123
}
- 轉義字元
-
printf("%f%%", 3.1415);
- %号在格式控制字元串中有特殊含義, 是以想輸出%必須添加一個轉移字元
-
#include <stdio.h>
int main(){
printf("%f%%", 3.1415); // 輸出結果3.1415%
}
Scanf函數
- scanf函數用于接收鍵盤輸入的内容, 是一個阻塞式函數,程式會停在scanf函數出現的地方, 直到接收到資料才會執行後面的代碼
-
-
scanf("格式控制字元串", 位址清單);
-
scanf("%d", &num);
-
- 基本用法
- 位址清單項中隻能傳入變量位址, 變量位址可以通過&符号+變量名稱的形式擷取
#include <stdio.h>
int main(){
int number;
scanf("%d", &number); // 接收一個整數
printf("number = %d\n", number);
}
- 接收非字元和字元串類型時, 空格、Tab和回車會被忽略
#include <stdio.h>
int main(){
float num;
// 例如:輸入 Tab 空格 回車 回車 Tab 空格 3.14 , 得到的結果還是3.14
scanf("%f", &num);
printf("num = %f\n", num);
}
- 非格式字元串原樣輸入, 格式控制字元串會指派給位址項清單項中的變量
- 不推薦這種寫法
#include <stdio.h>
int main(){
int number;
// 使用者必須輸入number = 數字 , 否則會得到一個意外的值
scanf("number = %d", &number);
printf("number = %d\n", number);
}
- 接收多條資料
- 格式控制字元串和位址清單項在數量和類型上必須一一對應
- 非字元和字元串情況下如果沒有指定多條資料的分隔符, 可以使用空格或者回車作為分隔符(不推薦這種寫法)
- 非字元和字元串情況下建議明确指定多條資料之間分隔符
#include <stdio.h>
int main(){
int number;
scanf("%d", &number);
printf("number = %d\n", number);
int value;
scanf("%d", &value);
printf("value = %d\n", value);
}
#include <stdio.h>
int main(){
int number;
int value;
// 可以輸入 數字 空格 數字, 或者 數字 回車 數字
scanf("%d%d", &number, &value);
printf("number = %d\n", number);
printf("value = %d\n", value);
}
#include <stdio.h>
int main(){
int number;
int value;
// 輸入 數字,數字 即可
scanf("%d,%d", &number, &value);
printf("number = %d\n", number);
printf("value = %d\n", value);
}
- \n是scanf函數的結束符号, 是以格式化字元串中不能出現\n
#include <stdio.h>
int main(){
int number;
// 輸入完畢之後按下回車無法結束輸入
scanf("%d\n", &number);
printf("number = %d\n", number);
}
scanf運作原理
- 系統會将使用者輸入的内容先放入輸入緩沖區
- scanf方式會從輸入緩沖區中逐個取出内容指派給變量
- 如果輸入緩沖區的内容不為空,scanf會一直從緩沖區中擷取,而不要求再次輸入
#include <stdio.h>
int main(){
int num1;
int num2;
char ch1;
scanf("%d%c%d", &num1, &ch1, &num2);
printf("num1 = %d, ch1 = %c, num2 = %d\n", num1, ch1, num2);
char ch2;
int num3;
scanf("%c%d",&ch2, &num3);
printf("ch2 = %c, num3 = %d\n", ch2, num3);
}
- 利用fflush方法清空緩沖區(不是所有平台都能使用)
-
fflush(stdin);
- C和C++的标準裡從來沒有定義過 fflush(stdin)
- MSDN 文檔裡清除的描述着"fflush on input stream is an extension to the C standard" (fflush 是在标準上擴充的函數, 不是标準函數, 是以不是所有平台都支援)
-
- 利用setbuf方法清空緩沖區(所有平台有效)
-
setbuf(stdin, NULL);
-
#include <stdio.h>
int main(){
int num1;
int num2;
char ch1;
scanf("%d%c%d", &num1, &ch1, &num2);
printf("num1 = %d, ch1 = %c, num2 = %d\n", num1, ch1, num2);
//fflush(stdin); // 清空輸入緩存區
setbuf(stdin, NULL); // 清空輸入緩存區
char ch2;
int num3;
scanf("%c%d",&ch2, &num3);
printf("ch2 = %c, num3 = %d\n", ch2, num3);
}
putchar和getchar
- putchar: 向螢幕輸出一個字元
#include <stdio.h>
int main(){
char ch = 'a';
putchar(ch); // 輸出a
}
- getchar: 從鍵盤獲得一個字元
#include <stdio.h>
int main(){
char ch;
ch = getchar();// 擷取一個字元
printf("ch = %c\n", ch);
}