一、格式化輸入
格式化輸入是指根據特定的格式從輸入流中讀取數據並存儲到變量中。scanf函數就是用於讀取標準輸入流(stdin)的函數之一。
函數原型:int scanf(const char *format, …);
其中format參數是格式控制字符串,決定了讀入數據的類型和格式,…是可變參數,根據format中指定的格式將相應數量和類型的參數傳入。如:
int num; scanf("%d",&num);
上述代碼中的format為”%d”,表示讀入一個十進制整數;第二個參數傳入的是一個指向int類型變量num的指針,用於存儲讀入的整數。
除了%d外,有一些常見的格式控制符:
格式控制符 | 類型 | 讀入數據 |
---|---|---|
%d | int | 十進制整數 |
%f | float、double | 浮點數 |
%c | char | 字符 |
%s | char* | 字符串 |
二、輸入多個數據
scanf函數可以一次讀入多個數據並分別存儲到不同的變量中。可以在format中使用多個格式控制符,並在…中傳入對應數量的變量地址。如:
int a,b; scanf("%d%d",&a,&b);
上述代碼中,可以同時讀入兩個整數,並分別存儲到變量a和變量b中。
三、輸入時跳過空白字符
scanf函數默認會跳過空白字符(空格、換行、回車等),直到讀入到非空白字符為止。這種行為稱為“多餘字符保留(extra characters remain)”。
例如,輸入”123\n”並讀入一個整數:
int num; scanf("%d",&num);
這時scanf函數會跳過’\n’這個字符,只讀取數字部分。在讀取完數字之後,如果輸入緩衝區中還有字符,則這些字符會被留在輸入緩衝區中,下一次讀取輸入流時會繼續讀入這些字符。
四、安全輸入
使用scanf函數時需要注意安全性。如果輸入數據不符合格式控制符指定的類型,則會導致結果無法預料,甚至可能引起程序崩潰。
為了安全輸入,可以使用scanf函數的返回值。scanf函數返回成功讀入的參數數量,可以根據這個值判斷讀入是否成功,並做出相應的處理。例如:
int num; if(scanf("%d",&num) != 1) { printf("輸入的不是整數!"); }
如果scanf函數返回的值不等於1,說明讀入的數據不是一個整數,此時輸出提示信息。
五、使用scanf函數讀入字符串
scanf函數可以使用%s格式控制符讀入字符串。需要注意的是,如果輸入的字符串中包含空格,則scanf函數會在第一個空格處停止讀取,後面的字符則留在輸入緩衝區中。可以使用scanf函數輸入寬度來限制讀入的字符串長度。如:
char str[20]; scanf("%19s",str); // 限制最大長度為19個字符
六、輸入指定長度的數據
有時需要讀入長度未知的數據,可以使用scanf函數的轉換格式來讀取指定長度的字符或者二進制數據。例如:
char str[10]; scanf("%10[^\n]",str); // 讀取長度不超過10的一行字符串
上述代碼中,%10[^\n]表示讀取長度不超過10個字符的一行字符串,^[^\n]表示除了換行符外的任意字符都可以匹配。
七、scanf函數的錯誤處理
scanf函數可以接收格式控制符,但是,它並不會判斷輸入數據的有效性。所以在使用scanf函數時一定要注意“中腳炎(足)問題(garbage in,garbage out)”,即輸入的數據可能包含有意外字符,這些字符可能會導致程序掛起,這可能是伏筆作為安全漏洞的存在風險。
因此,scanf函數還有些潛在的問題需要我們注意,例如:緩衝區溢出、格式串不匹配、行結束符等問題的缺陷。
備註:請注意如何處置溢出問題,使用可信的輸入的遜確缺陷以防礙止相應的漏洞,保障系統的穩定性。
原創文章,作者:STZD,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/134137.html