【问题标题】:Do-while loop does not end?Do-while 循环没有结束?
【发布时间】:2014-11-20 20:59:28
【问题描述】:

我遇到了最奇怪的问题!我需要制作一个程序,用户必须输入一个 10 位数字。所以我用 do-while 循环检查输入:

do
{
    cout<<"Enter a 10-digit number: "<<endl;
    cin>>number;
} 
while (numberOfDigits(number) != 10);

这里是 numberOfDigits 函数:

    int numberOfDigits(int num)
    {
        int d = 0;

        while (num > 0)
        {
            num /= 10;
            d++;
        }

        return d;
    }

所以当我输入一个小于 10 的数字时,它会循环并从头开始(告诉我再次输入一个 10 位数字)。但是,当我输入一个超过 10 位的数字时,会出现死循环,并且控制台不会停止打印“输入 10 位数字:”...有什么想法吗?

【问题讨论】:

  • 尝试将 int 更改为 long long
  • int 通常为 32 位宽;一个 32 位(有符号)整数的值只能达到 2**31,或者刚刚超过 20 亿,这已经是 10 位数字了。除此之外的任何内容都不适合 int,并且cin 进入错误状态,它无法读取其他任何内容(如果您键入也会发生同样的情况,例如“cat”而不是数字)。验证输入的安全方法是将所有内容读取为字符串,然后检查它,如果验证通过,则将其转换为最终类型(int 等)。
  • 请发MCVE

标签: c++ function do-while


【解决方案1】:

我的猜测是你超出了 int 的最大范围。如果您输入的数字高于2,147,483,647,考虑到您需要 10 个数字,这极有可能。尝试使用 long long。

int numberOfDigits(long long num)
{
    long long d = 0;

    while (num > 0)
    {
        num /= 10;
        d++;
    }

    return d;
}

我刚刚尝试过,它对我来说很好用。我用来测试的完整程序:

using namespace std;

int numberOfDigits(long long num)
{
    long long d = 0;

    while (num > 0)
    {
        num /= 10;
        d++;
    }

    return d;
}

int main()
{
    long long number = 0;
    do
    {
        cout<<"Enter a 10-digit number: "<<endl;
        cin>>number;
    } 
    while (numberOfDigits(number) != 10);
    return 1;
}

【讨论】:

  • @Grice,他正在输入 10 个 digits,因此任何以 3 开头的 10 位数字都会溢出 int。
  • 是的,当我输入一个大多数情况下以 1 或 2 开头的数字时,它确实有效,但对于较大的值,它会崩溃。我将其更改为 long long,现在它可以正常工作了。没有考虑类型的范围...谢谢大家!
  • @aquinas 我的错误,OP 的声明 when I input a number bigger than or equal to 10 让我假设他输入了文字 10 作为数字。
  • 是的,我的错,我现在就改
【解决方案2】:

如果你改变了

while (numberOfDigits(number) != 10)

while (numberOfDigits(number)

这样它会继续 do-while 循环,直到用户选择了一个小于或等于的数字。

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 2017-04-03
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多