1樓:悽臨雨
目前除了本答案,其他兩個答案全有錯
關鍵在於%d不接受【.】,遇到.後scanf直接返回0表示讀取失敗,且【.】留在輸入緩衝區中,下一次迴圈繼續出錯。
如何處理?
1.用double變數 %lf 給scanf。
2.保證你的輸入正確,因此程式無需修改
3.先讀取一整行【字串】,再從一行裡進一步讀取。
#include
intmain
(void);
// 吃掉非0~9,有可能讀取不成功返回0,但是無所謂scanf
("%*[^0-9]"
);// 讀取0~9開頭直到空格換行之前,到字串裡。順便吃掉乙個換行符
intret1
=scanf
("%[^
\n]%*c"
,buff
);int
ret2
=sscanf
(buff
,"%d",&
B[i]);
// 從已讀取行buff中讀入整數if(
ret2!=1
)// 讀取失敗
printf
("讀入行【%s】\n"
,buff
);printf
("讀入整數【%d】\n"
,B[i
]);}
/*輸入第1個元素的值=
4.56
讀入行【4.56】
讀入整數
輸入第2個元素的值=
4 556
讀入行讀入整數
輸入第3個元素的值=
讀入行讀入整數
*/return0;}
2樓:乙隻羊
因為scanf不接收空格和回車所以當你第一次迴圈scanf時,輸入3.5並回車時,回車會留在輸入緩衝區,
第二、第三次迴圈執行scanf時,輸入緩衝區以及有乙個回車了,scanf這時會直接讀取到回車,會讀取失敗直接結束,這時賦值給陣列變數B的變數val還是上一次的資料。
又因為你的陣列變數B是整型變數,小數部分會被丟棄,所以最終所有數值都為3。
解決辦法:
在scanf後面加一句 while((c = getchar()) != '\n' && c != EOF); 吸收掉回車即可。
3樓:機械夯客
如果輸入整數,會要求輸入3次。但輸入小數3.5後,開始自動執行,截圖為自動執行結果。
個人理解,輸入3.5,按照順序,第一次讀取3,第二次讀取.5,由於是int型別,取整為0,第三次應該要求再次輸入,但執行結果奇怪,全部自動執行,且所有值為3
請教乙個C語言指標陣列問題?
郭建波 陣列指標 也稱行指標 定義 int p 10 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是10,也可以說是p的步長。也就是說執行p 1時,p要跨過10個整型資料的長度。例 int p 4 該語句是定義乙個陣列指標,指向含4個元素的一維陣列。所以陣列指標也稱指...
C語言5x5陣列亂碼怎麼解決?
for r 0 r N r 在一行裡輸入一大串,其實先讀進緩衝區了,然後scanf s再去一點點取出來 如果想忽略多輸入的東西,清一下緩衝應該可以。 微塵 include standard input output functions define N 5 int main void printf ...
C語言二維陣列的名稱的困惑?
暮無井見鈴 講無型別的位址本身儲存什麼值沒有意義。位址是什麼型別指標的值 要求合法且非 NULL 該位址 就儲存這個型別的物件。注意具體程式中能合法讀取某個位址的指標型別是較為有限的。arr 是 int 10 10 型別陣列物件,可以隱式轉換成 int 10 型別指標值。該指標值指向陣列首元素。取 ...