我正在尝试做一个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);
}
答案 0 :(得分:1)
您系统中的reduce
是什么?它是4个字节(32位)吗?
reduce
的 int
,有32位,总是小于11(我的意思是nDigits
等于int
只给出{{1} }}),因此条件为TRUE(因为INT_MAX
给出2147483647
,即10
)。
因此,请考虑更改数据表示的类型。
选项:
(nDigits < 13 || nDigits > 16)
存储最多16个字符的字符串(在字符串内,您可以检查所有字符是否为数字,请参阅isdigit)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)