You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制输入最多16位数字并提取任意长度数字的每一位

问题1:解决‘undeclared identifier’报错及输入长度限制

你的代码里导致报错和逻辑错误的几个关键点:

  • 变量作用域错误:card在do循环的大括号内声明,出了这个范围就无法访问,后续所有用到card的地方都会触发未声明错误。
  • 未声明变量:firstdigit和lastdigit没有指定类型,C语言要求变量必须先声明再使用。
  • 语法与逻辑错误:while (card ! = 0)的! =多了空格,应为!=;且do-while的结构完全错误,你把计数逻辑写在了while的大括号里,这会导致计数根本不生效。
  • 输入长度限制缺失:原来的代码没有判断位数是否≤16的逻辑。

修正后的基础代码(修复报错+实现16位限制):

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int count = 0;
    long long card;
    // 循环获取输入,直到位数合法(1-16位)
    do
    {
        card = get_long_long("Enter your card number: ");
        count = 0;
        long long temp = card;
        // 计算当前输入的位数
        while (temp != 0)
        {
            temp /= 10;
            count++;
        }
    } while (count == 0 || count > 16); // 拒绝0或超过16位的输入

    printf("Card number: %lld\n", card);
    printf("Number of digits: %d \n", count);

    // 提取首位
    long long firstdigit = card;
    while (firstdigit >= 10) // 修正判断条件,确保拿到第一位
    {
        firstdigit /= 10;
    }
    printf("First digit = %lld \n", firstdigit);

    // 提取末位
    int lastdigit = card % 10;
    printf("Last digit= %d \n", lastdigit);

    return 0;
}
问题2:提取数字的每一位(无需数组)

不用数组的话,可以利用已算出的位数count,通过计算10的幂次作为除数来定位每一位:

  • 第1位:用数字除以10^(count-1),再取模10
  • 第2位:用数字除以10^(count-2),再取模10
  • 以此类推,直到第count位

在上面修正后的代码中,添加以下代码即可实现示例中的输出:

// 提取并打印每一位
printf("\nDigits breakdown:\n");
for (int i = 1; i <= count; i++)
{
    // 计算当前位对应的除数:10^(count - i)
    long long divisor = 1;
    for (int j = 0; j < count - i; j++)
    {
        divisor *= 10;
    }
    int current_digit = (card / divisor) % 10;

    // 处理序数后缀(1st/2nd/3rd/4th...)
    char suffix[4];
    if (i == 1)
        snprintf(suffix, sizeof(suffix), "st");
    else if (i == 2)
        snprintf(suffix, sizeof(suffix), "nd");
    else if (i == 3)
        snprintf(suffix, sizeof(suffix), "rd");
    else
        snprintf(suffix, sizeof(suffix), "th");
    
    printf("%d%s digit: %d\n", i, suffix, current_digit);
}

如果不需要序数后缀的复杂处理,也可以简化为:

printf("%d-th digit: %d\n", i, current_digit);

内容的提问来源于stack exchange,提问作者Sgathach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:35:21