用getchar吸掉回車等會對scanf獲取資料產生干擾的字元(百試不爽)
1.scanf(「%d\n」,&t);
異常範例:
#include
intmain()
;for
(int i =
0;i <
5;i ++
)for
(int i =
0;i <
7;i++
)printf
("%d :%d "
,i,a[i]);
}
解決辦法:①把\n,\t等去掉就好了。如果要用\n,\t,來規範輸入,可以在輸入後加個printf("\n");或者printf("\t");
②如果非要用』\n』,』\t』,就在scanf後面寫個getchar吸掉這些多餘字元。
分析:2.scanf(「%d」,&t);對scanf(「%c」,&c);的影響。scanf 對資料的獲取是嚴格按照雙引號內的格式進行的,所以上述例子中每輸入乙個資料都要有個回車,即\n來滿足格式,所以輸入1後的回車(\n)被當成了輸入格式,而本身scanf需要乙個回車(\n)來結束此次資料輸入,所以再輸入2時,2被留在了資料緩衝區之,直到2之後輸入的回車(\n)來充當輸入輸入資料1的結束命令.
eg:
#include
intmain()
;int k;
scanf
("%d"
,&k)
;for
(int i =
0;i <
5;i ++
)printf
("k: %d\n"
,k);
printf
("輸出字元: ");
for(
int i =
0;i <
5;i++
)printf
("a[%d]:%c "
,i,a[i]);
printf
(" 輸出字元ascii碼: ");
for(
int i =
0;i <
5;i++
)printf
("a[%d]:%d "
,i,a[i]);
}
解決方法scanf%c使用難度較大,比較容易導致錯誤,所以建議謹慎使用。
①用寫乙個getchar在每個scanf後面吸掉回車符(個人比較建議,能過平台測試,c++也會用到)這樣才能使得scanf("%c")讀到想要的字元,而不是回車符。
②用scanf("%s『』)scanf("%c")代替來獲取字元(要自己先試下)
③如果只是編譯器,oj上好像用不了,在scanf("%d",&k);之後加個fflush(stdin)語句可以起到清空資料緩衝區的作用。
分析:3.使用scanf易錯點。對於這個**樣例如果自己在編譯器上跑一下,結果上看,a[0]獲取的是換行符,ascii碼為10,'e』並沒有被a獲取。
用於結束scanf輸入的回車被%c,當作字元獲取了。建議獲取字元時別用%c。%c會將空格,回車等,一切符號讀入。
雖然以上問題可以通過在scanf("%d",&k);之後加個fflush(stdin)語句(清空資料緩衝去內字元。
1.注意輸入資料要按照scanf內雙引號給出的格式。4.scanf()返回值使用2.scanf中%s,不需要&,且%s不讀空格,製表符,回車符,會把這些字元當做分隔符,遇到空格就停,可用gets()函式來獲取含空格字串。
3.scanf函式返回值為成功讀入的資料項數。fscanf 函式返回值也是成功讀入的資料項數,檔案末尾隱藏著eof,所以,最後一次會獲取到eof。
可以利用scanf和fscanf函式返回值來確定是否成功讀入正確資料,具體實現如下
//method1if(
fscanf
(f2,
"%d %s"
,&s -> data.snum, s -> data.name)==2
)else
//method2
while(!
scanf
("%d"
,&choose)
)//資料輸入異常處理
oracle錯誤異常資訊,和解決辦法
1.ora 02292外來鍵約束問題 一般在刪除時會遇到 原因 通常在刪除某個表a的時候,會出現這個錯誤。原因是另乙個表b的某個字段引用了a表的某個字段作為外來鍵約束 解決辦法 1.先檢視是哪個表引用了a的字段做為外來鍵 select table name from all constraints ...
資料庫程式設計 MySQL 常見異常和解決辦法
mysqlslap 可以用於模擬伺服器的負載,並輸出計時資訊。測試時,可以指定併發連線數,可以指定 sql 語句。如果沒有指定 sql 語句,mysqlslap 會自動生成查詢 schema 的 select 語句。但是可能會報錯 mysqlslap unknown variable default...
CSS浮動副作用問題分析和解決辦法
塊狀元素,會鑽進浮動元素的下面,被浮動元素所覆蓋 行內元素,例如文字,則會環繞在浮動元素的周圍,為浮動元素留出空間 浮動元素的父元素坍縮 手動給父元素新增高度通過clear清除浮動 clear屬性 某個方向上不能有浮動 clear取值 left 元素的左邊不能有活動運輸 right 元素的郵編不能有...