06-printf和scanf函數(shù)-指趣學(xué)院

printf函數(shù)

  • printf函數(shù)稱之為格式輸出函數(shù),方法名稱的最后一個(gè)字母f表示format。其功能是按照用戶指定的格式,把指定的數(shù)據(jù)輸出到屏幕上
  • printf函數(shù)的調(diào)用格式為:
    • printf("格式控制字符串",輸出項(xiàng)列表 );
    • 例如:printf("a = %d, b = %d",a, b);
    • 非格式字符串原樣輸出, 格式控制字符串會(huì)被輸出項(xiàng)列表中的數(shù)據(jù)替換
    • 注意: 格式控制字符串和輸出項(xiàng)在數(shù)量和類型上必須一一對(duì)應(yīng)

  • 格式控制字符串
    • 形式: %[標(biāo)志][輸出寬度][.精度][長(zhǎng)度]類型

  • 類型
    • 格式: printf("a = %類型", a);
    • 類型字符串用以表示輸出數(shù)據(jù)的類型, 其格式符和意義如下所示
類型 含義
d 有符號(hào)10進(jìn)制整型
i 有符號(hào)10進(jìn)制整型
u 無符號(hào)10進(jìn)制整型
o 無符號(hào)8進(jìn)制整型
x 無符號(hào)16進(jìn)制整型
X 無符號(hào)16進(jìn)制整型
f 單、雙精度浮點(diǎn)數(shù)(默認(rèn)保留6位小數(shù))
e / E 以指數(shù)形式輸出單、雙精度浮點(diǎn)數(shù)
g / G 以最短輸出寬度,輸出單、雙精度浮點(diǎn)數(shù)
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';
    // 有符號(hào)整數(shù)(可以輸出負(fù)數(shù))
    printf("a = %d\n", a); // 10
    printf("a = %i\n", a); // 10

    // 無符號(hào)整數(shù)(不可以輸出負(fù)數(shù))
    printf("a = %u\n", a); // 10
    printf("b = %u\n", b); // 429496786

    // 無符號(hào)八進(jìn)制整數(shù)(不可以輸出負(fù)數(shù))
    printf("a = %o\n", a); // 12
    printf("b = %o\n", b); // 37777777766

    // 無符號(hào)十六進(jìn)制整數(shù)(不可以輸出負(fù)數(shù))
    printf("a = %x\n", a); // a
    printf("b = %x\n", b); // fffffff6

    // 無符號(hào)十六進(jìn)制整數(shù)(不可以輸出負(fù)數(shù))
    printf("a = %X\n", a); // A
    printf("b = %X\n", b); // FFFFFFF6

    // 單、雙精度浮點(diǎn)數(shù)(默認(rèn)保留6位小數(shù))
    printf("c = %f\n", c); // 6.600000
    printf("d = %lf\n", d); // 3.141593

    // 以指數(shù)形式輸出單、雙精度浮點(diǎn)數(shù)
    printf("e = %e\n", e); // 1.010000e+001
    printf("e = %E\n", e); // 1.010000E+001
    
    // 以最短輸出寬度,輸出單、雙精度浮點(diǎn)數(shù)
    printf("e = %g\n", e); // 10.1
    printf("e = %G\n", e); // 10.1
    
    // 輸出字符
    printf("f = %c\n", f); // a
}

  • 寬度
    • 格式: printf("a = %[寬度]類型", a);
    • 用十進(jìn)制整數(shù)來指定輸出的寬度, 如果實(shí)際位數(shù)多于指定寬度,則按照實(shí)際位數(shù)輸出, 如果實(shí)際位數(shù)少于指定寬度則以空格補(bǔ)位
#include <stdio.h>
int main(){
    // 實(shí)際位數(shù)小于指定寬度
    int a = 1;
    printf("a =|%d|\n", a); // |1|
    printf("a =|%5d|\n", a); // |    1|
    // 實(shí)際位數(shù)大于指定寬度
    int b = 1234567;
    printf("b =|%d|\n", b); // |1234567|
    printf("b =|%5d|\n", b); // |1234567|
}

  • 標(biāo)志
    • 格式: printf("a = %[標(biāo)志][寬度]類型", a);
標(biāo)志 含義
- 左對(duì)齊, 默認(rèn)右對(duì)齊
+ 當(dāng)輸出值為正數(shù)時(shí),在輸出值前面加上一個(gè)+號(hào), 默認(rèn)不顯示
0 右對(duì)齊時(shí), 用0填充寬度.(默認(rèn)用空格填充)
空格 輸出值為正數(shù)時(shí),在輸出值前面加上空格, 為負(fù)數(shù)時(shí)加上負(fù)號(hào)
# 對(duì)c、s、d、u類型無影響
# 對(duì)o類型, 在輸出時(shí)加前綴o
# 對(duì)x類型,在輸出時(shí)加前綴0x
#include <stdio.h>
int main(){
    int a = 1;
    int b = -1;
    // -號(hào)標(biāo)志
    printf("a =|%d|\n", a); // |1|
    printf("a =|%5d|\n", a); // |    1|
    printf("a =|%-5d|\n", a);// |1    |
    // +號(hào)標(biāo)志
    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標(biāo)志
    printf("a =|%5d|\n", a); // |    1|
    printf("a =|%05d|\n", a); // |00001|
    // 空格標(biāo)志
    printf("a =|% d|\n", a); // | 1|
    printf("b =|% d|\n", b); // |-1|
    // #號(hào)
    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);
    • 精度格式符以"."開頭, 后面跟上十進(jìn)制整數(shù), 用于指定需要輸出多少位小數(shù), 如果輸出位數(shù)大于指定的精度, 則刪除超出的部分
#include <stdio.h>
int main(){
    double a = 3.1415926;
    printf("a = %.2f\n", a); // 3.14
}
  • 動(dòng)態(tài)指定保留小數(shù)位數(shù)
    • 格式: printf("a = %.*f", a);
#include <stdio.h>
int main(){
    double a = 3.1415926;
    printf("a = %.*f", 2, a); // 3.14
}
  • 實(shí)型(浮點(diǎn)類型)有效位數(shù)問題
    • 對(duì)于單精度數(shù),使用%f格式符輸出時(shí),僅前6~7位是有效數(shù)字
    • 對(duì)于雙精度數(shù),使用%lf格式符輸出時(shí),前15~16位是有效數(shù)字
    • 有效位數(shù)和精度(保留多少位)不同, 有效位數(shù)是指從第一個(gè)非零數(shù)字開始,誤差不超過本數(shù)位半個(gè)單位的、精確可信的數(shù)位
    • 有效位數(shù)包含小數(shù)點(diǎn)前的非零數(shù)位
#include <stdio.h>
int main(){
    //        1234.567871093750000
    float a = 1234.567890123456789;
    //         1234.567890123456900
    double b = 1234.567890123456789;
    printf("a = %.15f\n", a); // 前8位數(shù)字是準(zhǔn)確的, 后面的都不準(zhǔn)確
    printf("b = %.15f\n", b); // 前16位數(shù)字是準(zhǔn)確的, 后面的都不準(zhǔn)確
}

  • 長(zhǎng)度
    • 格式: printf("a = %[長(zhǎng)度]類型", a);
長(zhǎng)度 修飾類型 含義
hh d、i、o、u、x 輸出char
h d、i、o、u、x 輸出 short int
l d、i、o、u、x 輸出 long int
ll d、i、o、u、x 輸出 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
}
  • 轉(zhuǎn)義字符
    • 格式: printf("%f%%", 3.1415);
    • %號(hào)在格式控制字符串中有特殊含義, 所以想輸出%必須添加一個(gè)轉(zhuǎn)移字符
#include <stdio.h>
int main(){
    printf("%f%%", 3.1415); // 輸出結(jié)果3.1415%
}

Scanf函數(shù)

  • scanf函數(shù)用于接收鍵盤輸入的內(nèi)容, 是一個(gè)阻塞式函數(shù),程序會(huì)停在scanf函數(shù)出現(xiàn)的地方, 直到接收到數(shù)據(jù)才會(huì)執(zhí)行后面的代碼
  • printf函數(shù)的調(diào)用格式為:
    • scanf("格式控制字符串", 地址列表);
    • 例如: scanf("%d", &num);

  • 基本用法
    • 地址列表項(xiàng)中只能傳入變量地址, 變量地址可以通過&符號(hào)+變量名稱的形式獲取
#include <stdio.h>
int main(){
    int number;
    scanf("%d", &number); // 接收一個(gè)整數(shù)
    printf("number = %d\n", number); 
}
  • 接收非字符和字符串類型時(shí), 空格、Tab和回車會(huì)被忽略
#include <stdio.h>
int main(){
    float num;
    // 例如:輸入 Tab 空格 回車 回車 Tab 空格 3.14 , 得到的結(jié)果還是3.14
    scanf("%f", &num);
    printf("num = %f\n", num);
}
  • 非格式字符串原樣輸入, 格式控制字符串會(huì)賦值給地址項(xiàng)列表項(xiàng)中的變量
    • 不推薦這種寫法
#include <stdio.h>
int main(){
    int number;
    // 用戶必須輸入number = 數(shù)字  , 否則會(huì)得到一個(gè)意外的值
    scanf("number = %d", &number);
    printf("number = %d\n", number);
}
  • 接收多條數(shù)據(jù)
    • 格式控制字符串和地址列表項(xiàng)在數(shù)量和類型上必須一一對(duì)應(yīng)
    • 非字符和字符串情況下如果沒有指定多條數(shù)據(jù)的分隔符, 可以使用空格或者回車作為分隔符(不推薦這種寫法)
    • 非字符和字符串情況下建議明確指定多條數(shù)據(jù)之間分隔符
#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;
    // 可以輸入 數(shù)字 空格 數(shù)字, 或者 數(shù)字 回車 數(shù)字
    scanf("%d%d", &number, &value);
    printf("number = %d\n", number);
    printf("value = %d\n", value);
}
#include <stdio.h>
int main(){
    int number;
    int value;
    // 輸入 數(shù)字,數(shù)字 即可
    scanf("%d,%d", &number, &value);
    printf("number = %d\n", number);
    printf("value = %d\n", value);
}
  • \n是scanf函數(shù)的結(jié)束符號(hào), 所以格式化字符串中不能出現(xiàn)\n
#include <stdio.h>
int main(){
    int number;
    // 輸入完畢之后按下回車無法結(jié)束輸入
    scanf("%d\n", &number);
    printf("number = %d\n", number);
}

scanf運(yùn)行原理

  • 系統(tǒng)會(huì)將用戶輸入的內(nèi)容先放入輸入緩沖區(qū)
  • scanf方式會(huì)從輸入緩沖區(qū)中逐個(gè)取出內(nèi)容賦值給變量
  • 如果輸入緩沖區(qū)的內(nèi)容不為空,scanf會(huì)一直從緩沖區(qū)中獲取,而不要求再次輸入
#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方法清空緩沖區(qū)(不是所有平臺(tái)都能使用)

    • 格式: fflush(stdin);
    • C和C++的標(biāo)準(zhǔn)里從來沒有定義過 fflush(stdin)
    • MSDN 文檔里清除的描述著"fflush on input stream is an extension to the C standard" (fflush 是在標(biāo)準(zhǔn)上擴(kuò)充的函數(shù), 不是標(biāo)準(zhǔn)函數(shù), 所以不是所有平臺(tái)都支持)
  • 利用setbuf方法清空緩沖區(qū)(所有平臺(tái)有效)

    • 格式: 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); // 清空輸入緩存區(qū)
    setbuf(stdin, NULL); // 清空輸入緩存區(qū)
    char ch2;
    int num3;
    scanf("%c%d",&ch2, &num3);
    printf("ch2 = %c, num3 = %d\n", ch2, num3);
}

putchar和getchar

  • putchar: 向屏幕輸出一個(gè)字符
#include <stdio.h>
int main(){
    char ch = 'a';
    putchar(ch); // 輸出a
}
  • getchar: 從鍵盤獲得一個(gè)字符
#include <stdio.h>
int main(){
    char ch;
    ch = getchar();// 獲取一個(gè)字符
    printf("ch = %c\n", ch);
}

配套視頻地址:www.it666.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容