C 有没有办法让我的do-while状态在两个间隔之间工作?

C 有没有办法让我的do-while状态在两个间隔之间工作?,c,cs50,C,Cs50,我试图用long得到一个13到16之间的数字,然后我需要把long转换成一个字符串,用strlen测量它,并验证它是否是一个13到16之间的数字 我的问题是,while的条件永远无法满足,无论我输入哪个数字 我试着改变while的条件,试着用for循环除以10来测量长的长度。。。什么都不管用 long card; char str[17]; int len; do { card = get_long("Number: ");

我试图用long得到一个13到16之间的数字,然后我需要把long转换成一个字符串,用strlen测量它,并验证它是否是一个13到16之间的数字

我的问题是,while的条件永远无法满足,无论我输入哪个数字

我试着改变while的条件,试着用for循环除以10来测量长的长度。。。什么都不管用

long card;
char str[17];
int len;

    do
        {
            card = get_long("Number: ");
            snprintf(str, 17, "%ld", card);
            len = strlen(str)-1;
        } 
        while (len >= 13 || len <=16);
长卡;
char-str[17];
内伦;
做
{
卡=获得长(“数字:”);
snprintf(str,17,“%ld”,卡片);
len=strlen(str)-1;
} 
而(len>=13 | | len为什么不呢

if(card >= 1000000000000 && card < 10000000000000000){
do_somthing();}
如果(卡>=10000000000&&card<100000000000000){
做某事();}

正如其他人指出的那样,
长的
只能保证包含最多32位或+/-2147483647。它可能适合更多,但没有保证。要适合10**17,您需要64位或
长的
。或者,您可以使用like
int64_t
,它将映射到适当的整数类型

您使用的方法有点麻烦。
get_long
将输入读取为字符串,将其转换为
long
,然后将其转换回字符串以检查长度

相反,读取该行更简单、更快,使用
sscanf
将其更改为一个数字,并检查它是否在1e13和1e17之间

更新:我们必须考虑负数。为此,我们采用绝对值

我没有CS50,我也不是一个粉丝;我发现它的抽象对学习C语言有害。所以在传统的C语言中,这就是
get\u long\u long
基本上所做的

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

#define DIGITS13 10000000000000LL
#define DIGITS17 100000000000000000LL

long long card;
long long abs_card;
char line[1024];

do {
    printf("Number: ");
    if( !fgets(line, sizeof(line), stdin) ) {
        break;
    }
    if( sscanf(line, "%lld", &card) != 1 ) {
        printf("Not a number.\n");
        continue;
    }

    abs_card = llabs(card);
}
while( abs_card < DIGITS13 || DIGITS17 <= abs_card);
#包括
#包括
#包括
#定义数字13 100000000000LL
#定义数字17 1000000000000000LL
龙卡;
长abs_卡;
字符行[1024];
做{
printf(“编号:”);
如果(!fgets(线,尺寸(线),标准){
打破
}
如果(sscanf(行、%lld、&card)!=1){
printf(“不是数字。\n”);
继续;
}
abs_卡=LLAB(卡);
}

虽然(abs_cardget_long
是一个包装器,它将一行作为字符串读取,然后将其作为
long
扫描。然后将其转换回字符串以检查其长度。最好读取字符串并检查其长度。或者只需检查长度是否在100000000000L和100000000000000L之间ise是CS50的一部分,他们建议使用long,但数组部分是我的决定。许多人通过在for循环中将输入除以10来解决这个问题。根据问题,数字输入可能是负数。发布的代码和答案不能正确处理这样的数字,这是可能的,但由于我测量了字符串长度,我原以为用另一种方法解决这个问题会更“优雅”,但我几乎接受了你的建议。你介意解释一下为什么在你的while状态下使用a!吗?@GuiVasconcelos你需要找到一个13到16位之间的数字,所以它会一直要求一个,直到得到一个为止。如果
while,可能会更好(卡片<100000000000LL | | 1000000000000000LL此答案仍然不能正确处理否定答案number@user3629249很好的观点。很容易修正,取绝对值。我会立即编辑。
long long card;
long long abs_card;

#define DIGITS13 10000000000000LL
#define DIGITS17 100000000000000000LL

do {
    card = get_long_long("Number: ");
    abs_card = llabs(card);
} 
while(abs_card < DIGITS13 || DIGITS17 <= abs_card);