我正在尝试做一个 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);
}
您的系统中int
是什么?是 4 字节(32 位(吗?
nDigits
对于具有 32 位的类型int
,将始终小于 11(我的意思是等于2147483647
的INT_MAX
只给出10
(,所以条件为 TRUE(因为(nDigits < 13 || nDigits > 16)
给出true OR false
,即true
(。
因此,请考虑更改数据表示的类型。
选项:
char[17]
存储最多 16 个字符的字符串(在字符串中,您可以检查所有字符是否都是数字,请参阅 isdigit(uint64_t
表格<stdint.h>
(似乎没有负卡号(
您应该将信用卡号作为字符串,而不是整数。
cs50 参考文档对此非常清楚:
get_int()
从标准输入中读取一行文本并将其返回为 如果可能,在 [-2^31 + 1, 2^31 - 2] 范围内的 int;如果文本 不表示此类 int,提示用户重试。领导和 尾随空格将被忽略。为简单起见,溢出不是 检测。如果无法读取行,则返回INT_MAX。
如 @VolAnd 所述,这在有符号的 int32 中终止,该 int32 始终少于 11 位,甚至可能是负数......
我将整数更改为longs,它可以工作。这就是 cs50 希望我们使用的。感谢大家的帮助!