我想知道標準C庫函數scanf()在我們調用scanf(「%d」,& var)時,如果輸入是整數或字符,當一個字符本身只是一個數字時,該如何檢查? 我知道當它遇到一個非整數時,它將它放回到輸入緩衝區並返回一個-1,但它怎麼知道輸入不是一個整數?scanf()如何檢查輸入是整數還是字符?
回答
你說得對,因爲每個字符都被表示爲一個8位整數。解決辦法很簡單:查看該號碼,看它是否在48-57範圍內,這是字符'0' - '9'的SCII代碼範圍。
從scanf()
source code的行1315開始,我們可以看到這一行動。 scanf()
實際上更復雜 - 它也會查看多字節字符來確定數值。 1740行是魔法發生的地方,而角色實際上被轉換爲數字。最後,可能這是最有用的,strtol()
函數執行循環來執行該轉換。
它試圖從流的開頭解析一個有效的十進制整數,實際上是可選的+或 - 然後是一個或多個數字的序列。
你能解釋一下它是如何解析的?例如。它將如何區分A和65的值,因爲A將以65的形式傳遞 - 它的ASCII值? – vjain27 2011-04-12 01:47:58
Uh scant嘗試在此處讀取十進制整數的ASCII表示。字母A不是這樣的一部分。 – 2011-04-12 01:54:22
你誤會了%d
格式說明。它不是而是返回輸入字符的ASCII值(可以使用%c
表示);它返回字符表示的整數。因此,在'9'
的輸入字符上,%d
返回值9--而不是'9'
的ASCII值。
(好吧,其實%d
着眼於字符序列,因此,如果輸入的是隨後'0'
其次' '
'9'
,它會解釋,由於90)。
基本上,scanf
函數根據您傳遞的轉換說明符匹配正則表達式。如果您指定%d
,則告知scanf
將輸入與'0'
和'9'
(可選帶有前導+
或-
字符)之間的一個或多個字符的正則表達式匹配。然後它將該字符序列轉換爲等效的整數值。
一個非常簡單的版本可能是這個樣子:
while (isdigit(c = fgetc(stream))
val = val * 10 + valueOf(c);
ungetc(c, stream);
其中isdigit
是一個標準庫函數返回true(非零)如果字符值表示十進制數字,和valueOf
是一個用戶定義的函數將表示整數('0'
-'9'
)的字符映射爲等效整數值(0
-9
)(我不知道標準庫函數會爲單個字符值執行此操作)。爲什麼不從c
減去'0'
以獲得等效的整數值?根據編碼的不同,不能保證所有的十進制整數字符都會按順序排列(All The World is Not ASCII);最好將實際轉換委託給知道當前編碼的函數。
在你提的這是默認控股整數只有那麼%d scanf函數聲明,它理解該變量作爲整數
- 1. 如何檢查輸入是整數,字符串還是float C++
- 2. 使用scanf驗證輸入(檢查輸入是char還是int)
- 3. 如何在JAVA中檢查輸入是整數還是字符串等?
- 4. 如何檢查給定的輸入是字符串還是整數?
- 5. 如何檢查jasmine.js中的值是整數還是字符串?
- 6. 如何檢查foreach索引是整數還是字符串smarty?
- 7. 如何檢查scanf後stdin中是否還有一些字符?
- 8. 如何檢查輸入字符串是否包含整數
- 9. 如何檢查輸入是整數/字符串?
- 10. 如何檢查輸入字符串是否爲整數
- 11. 如何在Objective-C中檢查輸入是雙字符還是字符串?
- 12. 如何檢查輸入數字整數是不是浮動?
- 13. 如何檢查輸入字段的文本是「是」還是「否」?
- 14. 檢查一個字符是整數還是字母
- 15. 檢查用戶輸入是浮點還是整數
- 16. 檢查字符串是整數還是浮點數
- 17. 在紅寶石中鍵入檢查輸入密鑰是字符還是數字
- 18. PHP檢查MySql的輸出是數字還是字符串
- 19. 使用stringstream.fail()檢查輸入是int還是字符串
- 20. 如何檢查字段是字符還是數字?
- 21. 如何檢查字符是字母還是數字?
- 22. 檢查輸入是否是整數
- 23. 如何檢查輸入是日期格式還是整數格式?使用java
- 24. 如果字符作爲輸入來代替整數,scanf是如何工作的
- 25. 如何檢查文本框中輸入的文本是字母還是數字
- 26. 如何檢查單個字符串輸入的部分是int還是char?
- 27. 檢查輸入是數字還是句點
- 28. 檢查輸入值是整數,命令,還是隻是壞數據(Python)
- 29. 如何檢查JSON數據是對象還是字符串?
- 30. 程序如何檢測字符串是數字還是字符?
感謝您對源代碼的解釋和參考! – vjain27 2011-04-12 03:09:28