scanf用法简介
scanf是一個變參函數,參數的數量和類型是不確定的
scanf()是C語言中的一個輸入函數。與printf函數一樣,都被聲明在頭文件stdio.h里,因此在使用scanf函數時要加上#include <stdio.h>。
功能:
函數 scanf() 是從標準輸入流stdin(標準輸入設備,一般指向鍵盤)中讀內容的通用子程序,可以說明的格式讀入多個字符,并保存在對應地址的變量中。?
函數參數:
函數的第一個參數是格式字符串,它指定了輸入的格式,第二個參數是先把輸入的字符串和第一個參數進行匹配然后進行轉換,轉換完成后,第二個參數表示的就是數據要存放的位置。函數的返回值是int
域寬:
以一個非零的十進制整數形式出現。表示該格式指令最多讀入的字符數。
格式說明符:
c 讀入域寬指定的數目個字符組成的字符序列(后面不會加上空字節),如果省略寬度則讀入單字符。如%c或%1c讀入單字符,%2c讀入兩個字符(后面不會加上空字節),以此類推。
s讀入一個的字符序列,后面會加上空字節,遇到空白字符(\t \r \n 空格等)完成讀取。
d 讀入有符號十進制整數。
u 讀入無符號十進制整數。
f? 讀入有符號浮點數。
o 讀入有符號八進制整數。
x,X讀入有符號十六進制整數。
p 讀入一個指針值。
% 讀入% 符號(百分號)
長度修飾符:
hh與d,o, u, x, X配合使用,表示對應一個signed char或unsigned char數據。
h與d,o, u, x, X配合使用,表示對應一個short int或unsigned short int數據。
l 與d,o, u, x, X配合使用,表示對應一個long int或unsigned long int數據,和f配合使用表示對應一個double數據。
ll與d,o, u, x, X配合使用,表示對應一個long long int或unsigned long long int數據。
如:?
使用函數時:
第一步: "%d %ld %f %lf"此時中間使用空格間隔,輸入時也需要用空格進行分割,scanf是直接把轉換結果送到接收變量中,所以使用必須規范。開始輸入的字符串和第一個參數對應,假設輸入的是1 2 3.0 4.0。1就和"%d"對應,2和%ld對應,3.0和%f對應,4.0和%lf對應。1對應"%d",將轉換為int類型的二進制(00000000 00000000 00000000 00000001)表示,int大小4字節。
第二步:把轉換得到的二進制放入對應需要存放的空間中,scanf中要求給出變量地址,所以不是數組的一般都要加上&,而對于數組,由于數組名本身就是地址,所以不用&。用對應類型的變量來接收轉換結果才能保證結果的準確,否則可能發生如4字節放到2字節里發生截斷的情況。
第三步:scanf()函數返回的值為:正確按指定格式輸入變量的個數。
例如:
scanf("%d%d", &a, &b);
如果a和b都被成功讀入,那么scanf()的返回值就是2;
如果只有a被成功讀入,返回值為1;
如果a和b都未被成功讀入,返回值為0;
如果遇到錯誤或遇到end of file,返回值為EOF。EOF是一個預定義的常量,等于-1。
?
通過轉到定義我們可以看到它的值?
我們可以通過判斷它的返回值來實現多組打印,如:
while(scanf("%d%d", &a, &b)!=EOF)
在windows系統中,我們可以通過按下Ctrl+Z和回車鍵來模擬EOF條件
注意點:
1.printf的參數由于比int小的變量會整形提升,float精度也會升級為double。所以,d可以用于char,short,int。f可以用于float和double。但scanf是直接把轉換結果送到接收變量中,所以使用必須規范。
2.?scanf函數中沒有類似printf的精度控制。
如: scanf("%5.2f",&a); 是非法的。
3.在高版本的 Visual Studio 編譯器中,scanf 被認為是不安全的,被棄用,編譯器會推薦你使用scanf_s代替 scanf。
但是在C語言標準中并沒有’scanf_s’,而這是由VS編譯器所提供的,因此在其他編譯器中將無法識別’scanf_s’,故在VS編譯器中使用’scanf_s’使程序的可移植性大受影響。
我們可以在程序的第一行(開頭)使用下面這句話,就可以正常使用scanf
#define _CRT_SECURE_NO_WARNINGS 1
總結
- 上一篇: 华硕 B150M-ET SERIES主板
- 下一篇: 桌面html倒计时如何添加,静态html