格式說明符對scanf的做用

<!--scanf printf 不負責-->

這裏重申格式說明符的做用以及重要性  能夠跳過
spa

考慮以下代碼

int n;
scanf("%c", &n);
printf("%c\n", n);

在這裏咱們將n當作了char型變量  而不是int  可是你會發現編譯經過了  而且運行結果也沒有問題
內存


再作一個改變
int n;
scanf("%d", &n);   // %c -> %d
printf("%c\n", n);

這時候咱們輸入65  程序會輸出A  由於65是A的ASCII碼

相反  咱們若是改爲這樣

int n;
scanf("%c", &n);
printf("%d\n", n);

咱們輸入A  程序就會輸出  65

看得出來  不管是scanf仍是printf  它們在給變量獲取輸入或者打印輸出的時候  不會明白這個變量自己的類型  而是須要藉助格式說明符

若是你想從中做梗  違反規則  編譯器不會知道

char ch;
scanf("%d", &ch);

你以%d對應着一個char類型變量的地址  scanf就會覺得這個char變量是一個int型變量

可是這存在隱患  由於若是你輸入的數足夠大  大到一字節裝不下(char類型是一字節)  那麼將會覆蓋掉其餘內存

scanf告訴你「既然你認爲它是一個四字節的int變量  那麼它就該存的下足夠大的值」

而事實上溢出了  超出的部分覆蓋掉的內存可能已被其餘變量佔用  也多是更危險的地帶  這將致使程序出錯甚至崩潰



所以請記住  printf和scanf不會明白你要打印或者獲取的變量到底是什麼類型  一切由格式說明符負責
編譯器

相關文章
相關標籤/搜索