为什么我的while循环停止不会停止?

时间:2017-07-30 19:40:35

标签: c do-while digits cs50

我正在尝试做一个do-while循环。只要用户输入的数字长度小于13位数或大于16位数,我就会尝试获取用户输入。

例:
1234(4位)将再次运行do while循环,
123493919295919(14位)将停止循环。

#include <cs50.h>
#include <stdio.h>
#include <math.h>

int main(void)
{
    int n;
    int nDigits;
    do
    {
        n = get_int("Please enter your credit card number:\n");
        nDigits = floor(log10(abs(n))) + 1;
    }
    while (nDigits < 13 || nDigits > 16);
}

3 个答案:

答案 0 :(得分:1)

您系统中的reduce是什么?它是4个字节(32位)吗?

类型reduce

int,有32位,总是小于11(我的意思是nDigits等于int只给出{{1} }}),因此条件为TRUE(因为INT_MAX给出2147483647,即10)。

因此,请考虑更改数据表示的类型。

选项:

  1. (nDigits < 13 || nDigits > 16)存储最多16个字符的字符串(在字符串内,您可以检查所有字符是否为数字,请参阅isdigit
  2. true OR false表单true(似乎没有负卡号)

答案 1 :(得分:1)

您应该将信用卡号码作为字符串,而不是int。

cs50参考文档非常清楚:

  

get_int()从标准输入读取一行文本并将其返回为   如果可能的话,在[-2 ^ 31 + 1,2 ^ 31 - 2]范围内的int;如果是文字   不表示这样的int,提示用户重试。领导和   尾随空格被忽略。为简单起见,溢出不是   检测。如果无法读取行,则返回INT_MAX。

如@VolAnd所述,这终止于签名 int32,其总是少于11位,甚至可能是负数......

答案 2 :(得分:0)

我将整数改为多头并且有效。这就是cs50希望我们使用的东西。感谢大家的帮助!