作者peder (嗶一聲之後)
看板C_and_CPP
標題[問題] scanf 讀值問題 會多跑一次
時間Fri Jan 15 22:21:26 2010
大家好 請教一下
遇到的問題: 我想要用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)
→ loveme00835:把scanf改成這樣 : scanf( "%d", &A[ i ] ); 01/15 22:27
→ loveme00835:原因不明, 只知道像輸入特定格式之類的(像電話號碼) 01/15 22:30
→ loveme00835:文字, 需要他讀的時候忽略, 才會在scanf控制字串內加 01/15 22:31
→ loveme00835:入其他字元 01/15 22:31
→ peder: 居然成功了! 感謝樓上的 love大 請問這個原理是什麼? 01/15 22:31
→ loveme00835:有請高手大大們解釋原理\⊙▽⊙/ 01/15 22:32
→ loveme00835:我也不知道= = 01/15 22:32
推 ledia:推測是 " %d " 的第一個空格會讓 scanf 期待一個泛白字元 01/15 22:34
→ ledia:你的輸入是 "0\n1\n2\n3" 像這樣, 0 前面沒有泛白字元 01/15 22:34
→ ledia:所以 match fail 01/15 22:35
→ ledia:可以維持 " %d " 然後輸入時先按一次換行再開始輸入 01/15 22:35
→ ledia:如果結果正常, 那就驗證了多加空白會讓 scanf 預期 match 空 01/15 22:35
→ ledia:白字元的假設 01/15 22:36
→ loveme00835:ledia大大, 所以控制字元都會抓囉? \t \n等等的... 01/15 22:36
推 ledia:我印象中是會, 但不確定會不會因此讓你第一個 0 讀失敗 01/15 22:40
→ ledia:我懶得翻 code 了 XDDDD 你如果有興趣可以自己試試 01/15 22:40
→ ledia:會抓的是 whitespace \r\n\t 和空白 01/15 22:42
→ loveme00835:剛剛試過, 先輸入\n \t都還是有bug⊙⊙ 01/15 22:42
推 LPH66:scanf 看到空白會做的事是吃掉連續的 whitespace 01/16 02:11
→ LPH66:但吃掉連續意味著他要看到不是 whitespace 的字才會停 01/16 02:12
→ LPH66:所以你就得輸入下一個數(它必然不是個 whitespace)來終止它 01/16 02:12
→ LPH66:另外也因為如此 空白可以吃掉 0 個 whitespace 01/16 02:13
→ loveme00835:嗯嗯 01/16 04:51