2013-11-09 73 views
0

我必須解決一個初看起來對我來說很簡單的練習。但是,我不太確定如何解決它。鑑於變量ab具有某些可接受的值,我應該在閱讀它們後確認它們是否在正確的範圍內?關於變量b,在示例中它是以科學記數法給出的,所以我應該使用e說明符來讀取它?最後但並非最不重要的是,','的分配抑制使用"%*[,]"必須符合角蛋白規格的掃描讀數變量

寫一組語句從標準輸入讀取三個變量abc,其中的變量有以下幾種類型:

a - 無符號短整型,b - 浮,c - 字符串最多31個字符

輸入值由一個逗號分隔。第一個變量是八進制數字。對於a和b的容許值如下:如果值不在允許範圍內,或者在錯誤的格式

-4331 < a <= 28731 
-1035 < b < 9749273 

合適的錯誤消息應給予。樣品輸入:

12745, -1.e-3, Is this a good one? 

0xEE04F, 21e75, Maybe this one... 

70073, 21e+6, Or this one. Could this string be too long to put into allocated area? 
+2

除非您真正閱讀它們,否則實際上沒有辦法驗證值。您可以通過檢查來自'scanf'的返回值來驗證'scanf'的輸入是否正確。 –

+0

如果您有權訪問Linux框,則'scanf'的手冊頁非常全面。 (如果你不這樣做,你應該可以通過Google搜索快速找到它。)您還需要了解'scanf'和您在調用'scanf'後需要寫入的代碼之間的分工以驗證您的輸入。 –

回答

1

OP:我應該驗證它們是否在正確的範圍內讀取它們之後? A:是的。掃描將檢查總量程誤差。然後代碼檢查本地範圍。

OP:使用e說明符讀取它?
答:a,e,f,gscanf()族中都是等效的。所以使用看起來合適的:e是很好的。

OP:的分配鎮壓 '' 使用"%*[,]"
一做:差不多:人們可以使用「%*1[,]",但","足以

使用fgets()sscanf(),然後檢查範圍

char buf[1000]; 
if (fgets(buf, sizeof buf, stdin) == NULL) { 
    handle_EOF_or_IOError(); 
} 
short Number; 
float x; 
char s[31+1]; 
if (3 != sscanf(buf, "%ho,%e, %31[^\n]", &Number, &x, s)) { 
    handle_ParseError(); 
} 
short NumberTooSmall = -4331; 
short NumberMax = 28731 
float xTooSmall = -1035.0f; 
float xTooBig = 9749273.0f; 
if ((Number <= NumberTooSmall) || (Number > NumberMax) || 
    (x <= xTooSmall) || (x >= xTooBig)) { 
    handle_RangeError(); 
} 

注意:當解析的字符串在「12745,-1.e-3,這是一個好的嗎?」等字符時出現一個微妙的問題,等等.OP說,是分隔符,這意味着字符串從開始。我認爲OP想要跳過領先空間並獲得"Is this ..."

假設IEEE binary32對於float,9749273.0需要24位來完全表示。由於這種格式對普通數有23 + 1位的精度,所以一切正常。應該注意浮點值的範圍測試。