我使用此代碼來檢查輸入的學號是否是正確的數字位數。是否有像.length()這樣的函數可用於變量類型double?謝謝!如何檢查C++中雙精度的長度
do {
cout << "Student's number: (Numeric only)";
cin >> studentNumber;
cin.ignore();
}
while (studentNumber.length() != 6);
我使用此代碼來檢查輸入的學號是否是正確的數字位數。是否有像.length()這樣的函數可用於變量類型double?謝謝!如何檢查C++中雙精度的長度
do {
cout << "Student's number: (Numeric only)";
cin >> studentNumber;
cin.ignore();
}
while (studentNumber.length() != 6);
它讀成文本,對其進行驗證,然後分析它:
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());
爲什麼不使用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位數字。
do {
cout << "Student's number: (Numeric only) " << flush;
} while(!(cin >> studentNumber) ||
(studentNumber < 100000) ||
(studentNumber > 999999));
的while
內放置cin >> studentNumber
也保證了用戶輸入的文本成功轉換到什麼都鍵入studentNumber
是。
將其作爲字符串讀取,並檢查它的長度(仍檢查其是否僅包含[0-9]
),然後轉換爲double。實際上,如果你打算用它做數學,那麼只能轉換成一個雙。否則,保持它爲一個字符串。
一般來說,在非字符串類型中用戶輸入是充滿危險的。以字符串的形式閱讀它,驗證並轉換。
其實這更有意義。因此,如果我從一開始就將變量更改爲字符串,我如何確保不輸入字符? – Blake
@Blake使用['std :: string :: find_first_not_of'](http://en.cppreference.com/w/cpp/string/basic_string/find_first_not_of)來驗證該條目僅包含數字[0 ,9] – Praetorian
考慮'std :: string :: find_first_not_of'或相關的方法。如果你的教師要求你使用c風格的字符串,那麼就是'strsep'。標準庫是你的朋友。 – dmckee
難道你不能只使用<
和>
?
// Require that studentNumber be 3 digits
if(studentNumber < 100 || studentNumber >= 1000) {
cout << "bad" << endl;
}
如果是1.00001,該怎麼辦? –
@CrazyEddie然後你開始提出產生ID的系統的人。 –
如果切換到整型,簡單的劃分可以做到這一點:
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;
}
如果是學生ID,請勿使用雙倍長時間使用。 – nneonneo
「studentNumber」的聲明在哪裏 - 例如它是什麼類型? – marko
這看起來像一個規範的作業問題,所以我建議你可能會明智地執行更多的驗證,而不僅僅是數字的長度,並考慮遇到非數字輸入時會發生什麼。 – marko