C语言如何判断long类型变量的首位数字?CS50信用卡校验问题
核心问题说明
你遇到的报错本质是C语言中long是整数数值类型,不属于数组/字符串类型,无法直接用[]语法按下标访问某一位数字,和你之前接触的JS字符串操作逻辑有区别。同时你原有代码还有两个隐藏问题:
- 在调用
get_long给card赋值前就尝试读取card的值,拿到的是无效垃圾值 - 输入校验的判断条件
card < 15逻辑错误,你想校验的是卡号位数而非数值大小,数值小于15的数最多只有2位,完全不符合信用卡号规则
实现方案(两种可选)
方案1:数值运算提取首位/前两位(符合CS50本题考点推荐)
要提取整数的首位数字,只需要循环对10做除法,直到结果小于10即可,此时剩下的数就是首位;如果需要提取前两位,就循环到结果小于100停止。
示例代码片段:
#include <cs50.h> #include <stdio.h> int main(void) { long card; // 先获取有效输入(这里简化校验,你后续可以补全位数校验逻辑) do { card = get_long("Enter Credit Card Number: "); } while (card < 1000000000000); // 信用卡最少13位,数值要大于等于1e12 // 提取前两位数字(因为AMEX、万事达都需要判断前两位) long first_two = card; while (first_two >= 100) { first_two /= 10; } // 提取首位数字 long first = first_two / 10; // 按规则判断 if (first_two == 34 || first_two == 37) { printf("AMEX\n"); } else if (first_two >=51 && first_two <=55) { printf("MASTERCARD\n"); } else if (first == 4) { printf("VISA\n"); } else { printf("INVALID\n"); } }
方案2:按字符串读取输入(适配你之前的JS开发习惯)
如果更习惯用下标访问字符,可以直接用get_string获取卡号输入,此时输入会以字符串形式存储,直接按下标读取对应位置的字符后,减去字符'0'即可转为对应的数字:
示例代码片段:
#include <cs50.h> #include <stdio.h> #include <string.h> int main(void) { string card = get_string("Enter Credit Card Number: "); int len = strlen(card); // 简单校验位数 if (len <13 || len >16) { printf("INVALID\n"); return 0; } // 字符转数字:ASCII码中数字字符连续排列,减'0'即可得到对应数值 int first = card[0] - '0'; int second = card[1] - '0'; int first_two = first *10 + second; // 判断逻辑和方案1一致 if (first_two == 34 || first_two == 37) { printf("AMEX\n"); } else if (first_two >=51 && first_two <=55) { printf("MASTERCARD\n"); } else if (first == 4) { printf("VISA\n"); } else { printf("INVALID\n"); } }
注意本题还要求实现卢恩算法校验,上面的代码只实现了前缀判断,后续你可以按题目要求补全对应的校验逻辑即可。
内容的提问来源于stack exchange,提问作者Maurice Filiatreault Hebert
相关产品推荐
相关产品推荐

