[爆卦]Scanf 空白是什麼?優點缺點精華區懶人包

為什麼這篇Scanf 空白鄉民發文收入到精華區:因為在Scanf 空白這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者peder (嗶一聲之後)看板C_and_CPP標題[問題] scanf 讀值問題 會多跑一次時...


大家好 請教一下

遇到的問題:
我想要用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

你可能也想看看

搜尋相關網站