C語言scanf語句吃掉回車或者空格問題及解決
問題描述
我們經(jīng)常在C語言輸入的時候,會發(fā)現(xiàn)scanf講空格或者回車“吃掉”了,導(dǎo)致程序的運行結(jié)果與預(yù)期不一致
以下面一個簡單例子為例
#include<stdio.h> char str[10]; int main() { int i; for(i=0;i<10;i++) { scanf("%c",&str[i]); } for(i=0;i<10;i++) { printf("%c",str[i]); } return 0; }
這個程序,獲取10個數(shù),然后打印出來
如果我們正常的輸入10個字符,打印正常
如果我們輸入a,然后回車,再輸入b,再回車… ,結(jié)果只能輸入5個字符,這就是我們經(jīng)常說的Scanf吃掉了你的回車
那么我們首先來了解一下scanf語句:
scanf
scanf()函數(shù)是格式輸入函數(shù),即按用戶指定的格式從標準輸入設(shè)備(鍵盤) 上把數(shù)據(jù)輸入到指定地址的變量中。
讀取方式:
一般格式為:scanf(格式控制,地址列表) 也就是scanf("%?",&?); 可以讀取相對于類型的數(shù)值并且存儲到制定變量,并且可以讀取多個數(shù)值,如數(shù)字,字符,字符串等 ,每次用到scanf‘時,他都會從數(shù)據(jù)緩存區(qū)讀取一個或多個字符,并存入相對應(yīng)的變量中
注意:
- scanf()在讀取數(shù)字時會跳過空格、制表符和換行符!
- %c只能輸出或輸入一個字符,%s輸出的是一串字符還有就是char a; string s;輸入的時候scanf("%c",&a);這里的&不能少,而scanf("%s",s);這里不能有&符號
重點:
scanf遇到 回車(enter),空格,TAB 就會結(jié)束一次輸入,空格不會接收
并且, scanf在一次輸入結(jié)束后,不會舍棄最后的回車符(即回車符會殘留在數(shù)據(jù)緩沖區(qū)中)
看下方程序
#include <stdio.h> int main(){ char c1,c2; scanf("%c %c",&c1,&c2); //這里有一個空格 printf("%d %d\n",c1,c2); scanf("%c%c",&c1,&c2); //這里沒有空格 printf("%d %d\n",c1,c2); return 0; }
第一次輸入a和b正常,沒有問題,但是第二次就出現(xiàn)問題了,
scanf單字符輸入時規(guī)定只接收一個字符,所以第一次輸入a b 時 ,第一個scanf("%c %c")之間有一個空格,所以在輸入字符a之后,我們可以輸入空格,enter,,scanf都會自動忽略它(那個空格會讀取停止字符并釋放掉),所以第一次輸入正常,但它卻把回車符也作為字符對待的。
在我們輸入完b之后按回車(Enter),這個回車符是放在緩沖區(qū)的,并且不會舍棄最后的回車符,此時的數(shù)據(jù)緩存區(qū)中還殘存著一個回車符,
第二次調(diào)用scanf("%c%c",&c1,&c2);是從緩沖區(qū)中取兩個字符,首先把第一次調(diào)用scanf("%c%c",&c1,&c2);后輸入的回車當作輸入字符賦值給c1 ,之后把a賦值給了c2
這就在輸入邏輯上造成了混亂。
我們這樣改一下
#include <stdio.h> int main(){ char c1,c2; scanf("%c %c",&c1,&c2); //這里有一個空格 printf("%d %d\n",c1,c2); scanf(" %c %c",&c1,&c2); //這里也有了空格 printf("%d %d\n",c1,c2); return 0; }
在第二個scanf中添加了兩個空格 然后我們正常輸入
scanf(" %c",&c)前面這個空格(換成\n或者\t也可以),這樣就把緩沖區(qū)中的回車當成第一個字符,讀取后丟掉
可以很好理解scanf中 空格的作用
空格( )即為讀取一個結(jié)束字符然后丟掉,而普通的字符不受影響
用好之后可以避免很多程序BUG
那么現(xiàn)在各位應(yīng)該知道上方的程序怎么改了
在對應(yīng)位置加好空格就可以了,
這個問題的解決雖然簡單,但是整個問題出現(xiàn)與解決的原因,才是我們需要學(xué)習(xí)的,不能只拘束與添加一個空格,而應(yīng)該清楚的明白其內(nèi)部的原理,這是我們學(xué)習(xí)所必須的一個品質(zhì)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
由static_cast和dynamic_cast到C++對象占用內(nèi)存的全面分析
下面小編就為大家?guī)硪黄蓅tatic_cast和dynamic_cast到C++對象占用內(nèi)存的全面分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01數(shù)據(jù)結(jié)構(gòu)與算法中二叉樹子結(jié)構(gòu)的詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法中二叉樹子結(jié)構(gòu)的詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04C++中Cbitmap,HBitmap,Bitmap區(qū)別及聯(lián)系
這篇文章主要介紹了C++中Cbitmap,HBitmap,Bitmap區(qū)別及聯(lián)系的相關(guān)資料,需要的朋友可以參考下2015-06-06