如何限制输入最多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
相关产品推荐
相关产品推荐

