天天看點

06-printf和scanf函數

printf函數

06-printf和scanf函數
  • printf函數稱之為格式輸出函數,方法名稱的最後一個字母f表示format。其功能是按照使用者指定的格式,把指定的資料輸出到螢幕上
  • printf函數的調用格式為:
    • printf("格式控制字元串",輸出項清單 );

    • 例如:

      printf("a = %d, b = %d",a, b);

      06-printf和scanf函數
    • 非格式字元串原樣輸出, 格式控制字元串會被輸出項清單中的資料替換
    • 注意: 格式控制字元串和輸出項在數量和類型上必須一一對應
  • 格式控制字元串
    • 形式:

      %[标志][輸出寬度][.精度][長度]類型

  • 類型
    • 格式:

      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);

      06-printf和scanf函數
  • 基本用法
    • 位址清單項中隻能傳入變量位址, 變量位址可以通過&符号+變量名稱的形式擷取
#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);
}
           
  • 06-printf和scanf函數
  • 利用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);
}
           

配套視訊位址: www.it666.com

繼續閱讀