判斷scanf接收的資料是否為一組純數字

2021-06-27 01:18:37 字數 1652 閱讀 3975

判斷scanf接收的資料是否為一組純數

為了程式的健壯性,我們需要檢查scanf函式接收的資料是否符合輸入要求,並提示使用者重新輸入正確的資料。

以判斷輸入是否是

正整數為例,有以下幾種方法:

方法(1)   利用scanf函式的返回值

scanf()讀取匹配format(格式)字串的輸入scanf()的返回值是成功賦值的變數數量, 發生錯誤時返回eof.

while(1)

else

fflush(stdin);//注意重新整理標準輸入緩衝區

問題:以數字開頭的不合法輸入無法判斷。方法(2)   作為乙個字串讀入,然後將字串轉換為整數。

這一段程式不僅能很好判斷scanf函式接收到的資料是否為正整數,還能判斷資料是否溢位,具有較好魯棒性

方法(3)      使用if (strlen(stdin->_ptr)> 2)條件判斷

while(1)

else

}

優點:**簡潔。

缺點:

(1)缺少溢位檢測功能。

(2)    不易使用,容易出錯。如下圖,當輸入緩衝區中存在非法資料後,對正常資料的判斷出現誤判,直到資料位數較多時才能判斷正確。

剛開始以為是緩衝區沒有重新整理導致if

(strlen(stdin->_ptr)> 2)判斷語句出錯,但即使在scanf前後加多個fflush(stdin),仍然會誤判數字。而且我發現當純數字的位數較大(比前面錯誤資料的位數長)時會判斷正確,因此我猜想是因為前面的錯誤資料被較長數字覆蓋後,才能正確判斷數字。還望大家賜教!

scanf的騷操作 scanf接收空格

include intmain void scanf 0 9 a printf s n a return0 上面的 什麼意思呢?試一下幾個輸入輸出 示例0 輸入 13579 輸出 13579 示例1 輸入 121abc 輸出 121 示例2 輸入 shouwang123nb455 輸出 注意 這裡輸...

判斷是否為陣列

在說明如何判斷乙個物件為陣列型別前,我們先鞏固下js的資料型別,js一共有六大資料型別 number string object boolean null undefined。除了前四個型別外,null 物件 陣列返回的都是object型別 對於函式型別返回的則是function,再比如typeof...

判斷是否為質數

程式接受兩個正整數的輸入,構成乙個閉區間,找出這個區間內的所有質數。判斷乙個數n是否為質數時,先對這個數開平方,隨後從2開始,迴圈到這個平行根,檢查其中的數能否整除數n,若能整除,則為合數,否則為質數。由於sqrt函式的返回值是double型別,為保證準確性 如sqrt 4 返回值可能是1.9999...