2012-09-25 29 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; 
}