第一次在这里提问。我正在参加在线类(class) (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' 返回为 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 (int i = l - i; i >= 0; i--)
i = 13 在第一次迭代中,但是你对 number
的声明是:
int number[l]
这使您可以访问数组索引 0..12(当 l=13
时),而 13 超出了数组的末尾...这会导致从其他地方添加一个随机值在 number
的堆栈分配的最后位置之外的内存中。
如果将循环更改为:
for (int i = l - 1; i >= 0; i--)
那么你就不会有这个问题了。
关于c - 字符串中的数字总和不正确 - cs50,基本 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25629792/