C++ 如何在C+中检查双精度的长度+;

C++ 如何在C+中检查双精度的长度+;,c++,C++,我用这个代码来检查输入的学生号的位数是否正确。是否有一个类似.length()的函数可以用于变量类型double?谢谢 do { cout << "Student's number: (Numeric only)"; cin >> studentNumber; cin.ignore(); } while (studentNumber.length() != 6); do{ 学生人数; cin.ignore(); } while(studentNu

我用这个代码来检查输入的学生号的位数是否正确。是否有一个类似.length()的函数可以用于变量类型double?谢谢

do {
    cout << "Student's number: (Numeric only)";
    cin >> studentNumber;
    cin.ignore();
}
while (studentNumber.length() != 6);
do{
学生人数;
cin.ignore();
}
while(studentNumber.length()!=6);
为什么不使用?然后,您需要对结果进行四舍五入,可能使用查找整数

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

do {
    cout << "Student's number: (Numeric only)";
    cin >> studentNumber;
    cin.ignore();
}
while (floor(log10(studentNumber)) != 6);
其中y是给定的,是你的指数

长话短说,
studentNumber
必须是6个字符,我们可以这样写

10^5 <= studentNumber < 10^6
仅当它是整数部分中的6位数字时。

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

cin>>studentNumber
放在
中,而
也可以确保用户输入的文本成功转换为
studentNumber
的任何类型。

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

一般来说,在非字符串类型中使用用户输入充满了危险。将其作为字符串读取、验证和转换。

您不能只使用

//要求studentNumber为3位数字
如果(学生编号<100 | |学生编号>=1000){

无法将其作为文本读取,验证它,然后解析它:

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());
std::字符串输入;
bool valid=false;
while(!valid){
cout>输入;
if(input.size()==6)
有效=真;
}
double studentNumber=strtod(input.c_str());

如果您切换到整数类型,简单的除法可以完成以下操作:

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;
}
int长\u位(长l)
{
//此代码适用于负数,但我们不需要它们
如果(升<0升)
抛出标准::超出范围(“请不要使用负数”);
整数计数;
对于(计数=0;l;l/=10L,++计数);
返回计数;
}

如果它是学生ID,不要使用双-使用一个长的代替。在哪里声明“代码>学生编号< /代码> -例如它是什么类型?这看起来像是一个规范的家庭作业问题,所以我建议你可以比数字的长度执行更多的验证,并考虑当非数字输入是什么时候发生什么。反算。声明在代码中的位置更高。你说得对,它是家庭作业,这不是作业的实际要求,但我如何检查字符和长度?我想过这样做,但我知道必须有一种方法来检查长度。谢谢。@Blake你可以用log10检查长度。相同的idea、 @blake进一步提示:
istream
上的extract运算符无法转换时会发生什么情况?例如,由于输入无效?异常?某些其他故障模式?studentNumber包含什么实际上更有意义。因此,如果我从一开始就将变量更改为字符串,如何确保不输入字符?@Bla可以使用类似的方法验证条目是否仅由数字[0,9]组成考虑<代码> STD::Stry::FundFixSTyNoToWix/Cuth>或相关方法。如果您的指导教师要求您使用C样式字符串,则代码< > StrSEP。标准库是您的朋友。@ CurryyDeDe,然后您向生成IDS的系统开火。
// Require that studentNumber be 3 digits
if(studentNumber < 100 || studentNumber >= 1000) {
    cout << "bad" << endl;
}
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());
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;
}