2012-09-25 46 views
0

我使用此代碼來檢查輸入的學號是否是正確的數字位數。是否有像.length()這樣的函數可用於變量類型double?謝謝!如何檢查C++中雙精度的長度

do { 
    cout << "Student's number: (Numeric only)"; 
    cin >> studentNumber; 
    cin.ignore(); 
} 
while (studentNumber.length() != 6); 
+5

如果是學生ID,請勿使用雙倍長時間使用。 – nneonneo

+0

「studentNumber」的聲明在哪裏 - 例如它是什麼類型? – marko

+3

這看起來像一個規範的作業問題,所以我建議你可能會明智地執行更多的驗證,而不僅僅是數字的長度,並考慮遇到非數字輸入時會發生什麼。 – marko

回答

3

它讀成文本,對其進行驗證,然後分析它:

std::string input; 
bool valid = false; 
while (!valid) { 
    cout << "Student's number: (Numeric only)"; 
    cin >> input; 
    if (input.size() == 6) 
     valid = true; 
} 
double studentNumber = strtod(input.c_str()); 
1

爲什麼不使用log10?那麼你需要四捨五入平定結果,也許用floor(double)找到整數

//remember math.h 
#include <math.h> 

do { 
    cout << "Student's number: (Numeric only)"; 
    cin >> studentNumber; 
    cin.ignore(); 
} 
while (floor(log10(studentNumber)) != 6); 

編輯: 一點解釋:LOG10讓你找到X在這個等式

10^x=y 

其中y,並給出是你的指數。

長話短說,studentNumber必須是6 '字符',我們可以把這個作爲

10^5 <= studentNumber < 10^6 

5 <= log10(studentNumber) < 6 

然後

floor(log10(studentNumber)) ==5 

只有當它是整數部分有6位數字。

3
do { 
    cout << "Student's number: (Numeric only) " << flush; 
} while(!(cin >> studentNumber) || 
     (studentNumber < 100000) || 
     (studentNumber > 999999)); 

while內放置cin >> studentNumber也保證了用戶輸入的文本成功轉換到什麼都鍵入studentNumber是。

+0

我想過這樣做,但我知道必須有一種方法來檢查長度。不過謝謝。 – Blake

+1

@Blake你可以用log10檢查長度。同樣的想法。 – Lalaland

+0

@blake另一個提示:當'istream'上的提取操作符無法轉換時會發生什麼 - 例如由於輸入無效?例外?其他一些失敗模式? studentNumber包含的是什麼 – marko

7

將其作爲字符串讀取,並檢查它的長度(仍檢查其是否僅包含[0-9]),然後轉換爲double。實際上,如果你打算用它做數學,那麼只能轉換成一個雙。否則,保持它爲一個字符串。

一般來說,在非字符串類型中用戶輸入是充滿危險的。以字符串的形式閱讀它,驗證並轉換。

+0

其實這更有意義。因此,如果我從一開始就將變量更改爲字符串,我如何確保不輸入字符? – Blake

+1

@Blake使用['std :: string :: find_first_not_of'](http://en.cppreference.com/w/cpp/string/basic_string/find_first_not_of)來驗證該條目僅包含數字[0 ,9] – Praetorian

+1

考慮'std :: string :: find_first_not_of'或相關的方法。如果你的教師要求你使用c風格的字符串,那麼就是'strsep'。標準庫是你的朋友。 – dmckee

3

難道你不能只使用<>

// Require that studentNumber be 3 digits 
if(studentNumber < 100 || studentNumber >= 1000) { 
    cout << "bad" << endl; 
} 
+0

如果是1.00001,該怎麼辦? –

+1

@CrazyEddie然後你開始提出產生ID的系統的人。 –

3

如果切換到整型,簡單的劃分可以做到這一點:

long studentNumber; 
do { 
    // get number 
} while (!(studentNumber/100000L) || studentNumber/1000000L); 

如果你真的想要一個完整的數字位數:

int long_digits(long l) 
{ 
    // this code will work for negative numbers, but we don't want them 
    if (l < 0L) 
     throw std::out_of_range("no negative numbers please"); 

    int count; 
    for (count = 0; l; l /= 10L, ++count); 
    return count; 
}