【发布时间】:2014-09-02 18:18:10
【问题描述】:
第一次在这里提问。我正在参加一个在线课程 (edx - cs50) 学习非常基本的 C。我正在研究一个检查信用卡号码有效性的程序。
虽然我确信我的代码需要清理(并且我愿意接受所有批评和建议!),但我的主要任务与我对数字求和的方式有关。
这是我在程序中经历的两种情况,然后是我遇到的问题。
- 向用户索要信用卡 -- 我输入 13 位数字。
- 输入一个有效的数字。
- 我在程序底部的“校验值”总和是正确的,等于 13 个 '1'。
我的第二种情况:
- 向用户索要信用卡 -- 我输入 2 位数字。
- 虽然循环声明它无效,并要求输入一个新数字 - 我输入 13 '1's。
- 我在程序底部的“校验值”总和等于 32780。
代码:
int main(void) {
// Initialize string for CCNumber
char s[16];
// User input
printf("Enter your credit card number, without dashes: ");
long long CCNumber = GetLongLong();
sprintf(s, "%lld", CCNumber);
int l = strlen(s);
printf("1st check:%d\n", l);
// Check valid CC length
while (l < 13 || l > 16 || l == 14) {
printf("Try again:\n");
long long CCNumber = GetLongLong();
sprintf(s, "%lld", CCNumber);
l = strlen(s);
}
// Check CCNumber length
printf("2nd check:%d\n", l);
// Put number into an array
int number[l];
for (int i = 0; i < l; i++) {
number[i] = s[i] - '0';
}
int sum = 0;
for (int i = l - i; i >= 0; i--) {
sum += number[i];
}
printf("Check value: %d\n", sum);
}
我对总和的情况感到有些困惑——为什么我输入的 13 个 '1's 返回为 32780?感谢所有帮助或提示。
这是我得到的输出:
retry@ubuntu:~/Documents/EDX$ ./credit2
Enter your credit card number, without dashes: 1111111111111
1st check:13
2nd check:13
Check value: 13
retry@ubuntu:~/Documents/EDX$ ./credit2
Enter your credit card number, without dashes: 11
1st check:2
Try again:
1111111111111
2nd check:13
Check value: 32780
【问题讨论】:
-
在最后一个
for循环中,您使用引用变量本身的表达式初始化i。你的意思是int i = l - 1?为什么要向后循环? -
M Oehm - 这是检查号码是否有效的一部分,我还没有实现。我必须从倒数第二个数字开始每隔一个数字相乘。