printf和scanf整理(後續填補)

2022-10-11 01:48:12 字數 1665 閱讀 2194

%d:以十進位制形式輸出整數(int)

%3d:指定寬度為3,不足的左邊補空格

%03d:一種左邊補0 的等寬格式,比如數字12,%03d出來就是: 012

%-3d:左對齊,不足三位右邊用空格填補

1 #include2

intmain()

3

①一般情況下,兩者可互相代替:有個int型變數a,於是有scanf("%d",&a)等價於scanf_s("%d",&a)

②scanf_s並非是標準庫的函式,而是vs中用以確保資料不會溢位。

比如,有個char  b[10]的字元陣列,一般下用scanf("%s",b),但是如果輸入時的字串長度超過9呢?(大小為10的字元陣列最多儲存長度為9的字串,因為最後乙個位置要儲存空字元)可能會導致溢位或對程式之後的輸入造成影響。

(圖  dev-c++編譯)

可見,scanf可能會造成記憶體洩漏,儘管可能上圖這種情況下能正確執行(和編譯器對**檢查嚴格是否有關),但是的的確確會有邏輯錯誤(陣列b的元素最大下標是9,而這裡b[10]竟然能夠成立),而這對於程式設計師而言是不允許的。

如果換成在vs 2015 ide中編譯(上面這個程式不在vs中執行,是因為scanf函式在vs中會報錯,除非對編譯環境進行修改(本萌並沒有試過~)),採用scanf_s函式如下:

1 #include2

intmain()3;

5 scanf_s("

%s", b,10);6

intn;

7 scanf_s("

%d",&n);

8 printf("

b=%s\nn=%d\n

", b, n);

9 printf("

b[9]=%c\n

", b[9

]);10

return0;

11 }

執**況:

圖1:由於輸入的字串長度超過9,並且大於10,以至於讀入b陣列出錯,經過除錯會發現,此時b中第乙個為ascii碼為0的空字元,之後9個竟然是ascii值為-2的'?'。b陣列輸入結束後,由於輸入流此時還有資料,緩衝不為空,以至於給整型n賦值時直接從輸入流中讀取剩下的數字(注意,此時存入n為數字,而不是字元)。

圖2:當剛好輸入10個字元時,由於b陣列只能存長度為9的字串,仍然出錯。但是此時輸入流緩衝為空,所以能繼續輸入資料,賦值給b。

圖3:當輸入的字串長度小於等於9時,則是正常輸入情形。由於b[9]為空字元,而空字元並不能顯示輸出,就有圖3的結果。

③scanf_s用法:當不是輸入字串時,和scanf格式相同;當輸入字串時,必須要在最後指出最大讀入的字元個數(注意,不是字串長度,讀者可以嘗試將上個**中的10改為9,然後採用圖3的輸入資料,b陣列則會出錯)。

scanf和printf的用法

scanf和printf的用法 printf是標準輸出函式 scanf是標準輸入函式 printf的格式為printf 輸出內容 scanf的格式為scanf 輸入控制符 輸入的變數位址 n表示變數n的位址 表示取址符 用在變數前獲得變數的位址 你寫的這兩句前面是顯示please input the...

scanf和printf的用法

scanf是 通過鍵盤給程式中的變數賦值 scanf 輸入控制符 輸入引數 它作用是將從鍵盤輸入的字元轉化為 輸入控制符 所規定格式的資料,然後存入以輸入引數的值為位址的變數中。之前的作業中有用到scanf以及相關的用法 int main void 輸入與輸出的格式應保持一致,scanf 的格式修飾...

scanf和printf的格式

scanf函式的一般語法格式為 scanf 格式佔位符列表,變數位址列表 常用的格式佔位符有 d 整型數 f 浮點型數 等。scanf 函式是通用終端格式bai化輸入函式,du它從標準輸入裝置 鍵盤 讀取輸zhi入的資訊。可以讀入任dao何固有型別的資料並自動把數值變換成適當的機內格式。其呼叫格式為...