[問題] scanf 讀值問題 會多跑一次

看板C_and_CPP作者 (嗶一聲之後)時間16年前 (2010/01/15 22:21), 編輯推噓3(3020)
留言23則, 4人參與, 最新討論串1/1
大家好 請教一下 遇到的問題: 我想要用for迴圈 讓scanf連續讀key in的值 可是會莫名的跳出空白的一行 讓scanf會多讀一次 主要的code #include <stdio.h> #include <stdlib.h> int main( void ) { int A[ 3 ] = { 0 }; int i; for ( i = 0; i <= 5; i++ ) { printf( " Enter A[ %d ]: ", i ); scanf( " %d ", &A[ i ] ); } printf( " \n "); for ( i = 0; i <= 5; i++ ) printf( " A[ %d ] is : %d\n ", i, A[ i ] ); system("PAUSE"); return 0; } 程式跑出來的錯誤結果: Enter A[ 0 ]: 0 1 //這邊會莫名多跳出空白的一行 一定要輸入值 會存到 A[1] 裡 Enter A[ 1 ]: 2 //然後這個 A[ 1 ] 會存到 A[ 2 ] 以下都是這樣 Enter A[ 2 ]: 3 A[ 0 ] is : 0 //輸出值 A[ 1 ] is : 1 A[ 2 ] is : 2 開發平台: Dev-C++, windows 看起來很簡單很正常啊... 測試很多遍都找不到bug 麻煩大家了 謝謝 :) -- ※ 編輯: peder 來自: 118.161.215.232 (01/15 22:22)

01/15 22:27, , 1F
把scanf改成這樣 : scanf( "%d", &A[ i ] );
01/15 22:27, 1F

01/15 22:30, , 2F
原因不明, 只知道像輸入特定格式之類的(像電話號碼)
01/15 22:30, 2F

01/15 22:31, , 3F
文字, 需要他讀的時候忽略, 才會在scanf控制字串內加
01/15 22:31, 3F

01/15 22:31, , 4F
入其他字元
01/15 22:31, 4F

01/15 22:31, , 5F
居然成功了! 感謝樓上的 love大 請問這個原理是什麼?
01/15 22:31, 5F

01/15 22:32, , 6F
有請高手大大們解釋原理\⊙▽⊙/
01/15 22:32, 6F

01/15 22:32, , 7F
我也不知道= =
01/15 22:32, 7F

01/15 22:34, , 8F
推測是 " %d " 的第一個空格會讓 scanf 期待一個泛白字元
01/15 22:34, 8F

01/15 22:34, , 9F
你的輸入是 "0\n1\n2\n3" 像這樣, 0 前面沒有泛白字元
01/15 22:34, 9F

01/15 22:35, , 10F
所以 match fail
01/15 22:35, 10F

01/15 22:35, , 11F
可以維持 " %d " 然後輸入時先按一次換行再開始輸入
01/15 22:35, 11F

01/15 22:35, , 12F
如果結果正常, 那就驗證了多加空白會讓 scanf 預期 match 空
01/15 22:35, 12F

01/15 22:36, , 13F
白字元的假設
01/15 22:36, 13F

01/15 22:36, , 14F
ledia大大, 所以控制字元都會抓囉? \t \n等等的...
01/15 22:36, 14F

01/15 22:40, , 15F
我印象中是會, 但不確定會不會因此讓你第一個 0 讀失敗
01/15 22:40, 15F

01/15 22:40, , 16F
我懶得翻 code 了 XDDDD 你如果有興趣可以自己試試
01/15 22:40, 16F

01/15 22:42, , 17F
會抓的是 whitespace \r\n\t 和空白
01/15 22:42, 17F

01/15 22:42, , 18F
剛剛試過, 先輸入\n \t都還是有bug⊙⊙
01/15 22:42, 18F

01/16 02:11, , 19F
scanf 看到空白會做的事是吃掉連續的 whitespace
01/16 02:11, 19F

01/16 02:12, , 20F
但吃掉連續意味著他要看到不是 whitespace 的字才會停
01/16 02:12, 20F

01/16 02:12, , 21F
所以你就得輸入下一個數(它必然不是個 whitespace)來終止它
01/16 02:12, 21F

01/16 02:13, , 22F
另外也因為如此 空白可以吃掉 0 個 whitespace
01/16 02:13, 22F

01/16 04:51, , 23F
嗯嗯
01/16 04:51, 23F
文章代碼(AID): #1BK7dfpM (C_and_CPP)