c语言 - 为什么我的 do 在循环停止中断时不起作用?



我正在尝试做一个 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(我的意思是等于2147483647INT_MAX只给出10(,所以条件为 TRUE(因为(nDigits < 13 || nDigits > 16)给出true OR false,即true(。

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

选项:

  1. char[17]存储最多 16 个字符的字符串(在字符串中,您可以检查所有字符是否都是数字,请参阅 isdigit(
  2. uint64_t表格<stdint.h>(似乎没有负卡号(

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

cs50 参考文档对此非常清楚:

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

如 @VolAnd 所述,这在有符号的 int32 中终止,该 int32 始终少于 11 位,甚至可能是负数......

我将整数更改为longs,它可以工作。这就是 cs50 希望我们使用的。感谢大家的帮助!

最新更新