0

我正在使用此代码来检查输入的学号是否是正确的位数。是否有像 .length() 这样的函数适用于变量类型 double?谢谢!

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

6 回答 6

7

将其作为字符串读取,在它仍然处于该表示形式时检查它的长度(还要检查它是否仅由 组成[0-9]),然后转换为双精度。实际上,如果你打算用它做数学,只转换成双精度数。否则将其保留为字符串。

一般来说,以非字符串类型获取用户输入是充满危险的。将其作为字符串读取,验证并转换。

于 2012-09-25T21:22:48.697 回答
4

将其读取为文本,对其进行验证,然后对其进行解析:

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());
于 2012-09-25T21:25:25.820 回答
3
do {
  cout << "Student's number: (Numeric only) " << flush;
} while( !( cin >> studentNumber ) || 
         ( studentNumber < 100000 ) || 
         ( studentNumber > 999999 ) );

放置cin >> studentNumber在其中while还可以确保用户输入的文本成功转换为任何类型studentNumber

于 2012-09-25T21:22:36.243 回答
3

你不能只使用<and>吗?

// Require that studentNumber be 3 digits
if(studentNumber < 100 || studentNumber >= 1000) {
    cout << "bad" << endl;
}
于 2012-09-25T21:23:12.383 回答
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;
}
于 2012-09-25T21:25:34.250 回答
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 位数字时。

于 2012-09-25T21:21:13.333 回答