【问题标题】:C: How to count digits of multiple digit integers using while loop?C:如何使用while循环计算多个数字整数的位数?
【发布时间】:2019-11-24 10:30:24
【问题描述】:
int main(){
        int cardnum;
        int count = 0;
        do{
            printf("Enter your 16-digit Credit Card Number!\n");
            scanf(" %d", &cardnum);
            while(cardnum>0)
            {
                cardnum = cardnum / 10;
                count++;
            }
        }while( count != 16);
    }

所以我正在尝试制作一个程序,要求您插入 CC 的 16 位数字,如果您不输入 16 位数字,它会一直询问您,直到您输入为止。

由于某种原因,我得到了一个无限循环。 smb能解释一下吗?

【问题讨论】:

  • 32bit int 不能容纳 16 位数字。
  • 将其作为字符串读取。
  • 您输入的是什么值?你认为哪个循环是无限的(你的代码中有两个)?

标签: c scanf do-while


【解决方案1】:

您不会在每次输入尝试时将 count 重置为 0。

int main(){
        int cardnum;
        int count = 0;
        do{
            count = 0; /* Added this */
            printf("Enter your 16-digit Credit Card Number!\n");
            scanf(" %d", &cardnum);
            while(cardnum>0)
            {
                cardnum = cardnum / 10;
                count++;
            }
        }while( count != 16);
    }

[编辑:这是不正确的。]不过,我认为您可以检查scanf() 的返回值以了解读取的字符数。那可能更容易。

最后,int 无法在其中保存 16 位数字的问题。

【讨论】:

  • 所以我应该加倍吗?所以它可以容纳更多?还有你是什么意思我怎么用scanf做呢
  • 检查long的范围,可能就足够了。
  • scanf 不返回读取的字符数;它返回成功读取的 arguments 数。对于给定的单个 %d ,成功的结果将是 1
  • 我的立场是正确的,但保留答案是为了不让未来的读者感到困惑,否则他们将不得不弄清楚你的评论。
【解决方案2】:

在大多数系统上,int 不会保存 16 位数字。它通常是 32 位的,最多可以存储 9 位数字)。

幸运的是,64 位整数可以容纳 19 位数字(如果有符号则为 18 位数字)。 (几乎)任何体面的 Linux 都将支持 64 位整数。对 OP 代码的改动很少:

  • 将“cardnum”更改为“long long int count”(long int 有时为 32)
  • 将 scanf 格式更改为 '%lld') ;
  • 更改“计数”循环以使用临时变量,否则您会丢失原始卡号。比如:
   long long int check_num = cardnum ;
   for (count=0 ; check_num > 0 ; count++) check_num /= 10 ;

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2011-09-29
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2017-07-23
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多