c - 字符串中的数字总和不正确 - cs50,基本 C

标签 c string sum cs50

第一次在这里提问。我正在参加在线类(class) (edx - cs50),学习非常基础的 C。我正在通过一个程序检查信用卡号码的有效性。

虽然我确信我的代码需要清理(并且我愿意接受所有批评和建议!),但我的主要任务与我对数字求和的方式有关。

以下是我在我的程序中遇到的两个场景以及我遇到的问题。

  1. 要求用户提供信用卡 -- 我输入 13 位数字。
  2. 输入一个有效的数字。
  3. 我在程序底部的“检查值”总和是正确的,等于 13 个 1。

我的第二种情况:

  1. 要求用户提供信用卡 -- 我输入 2 位数字。
  2. 虽然循环声明它无效,并要求输入一个新数字 -- 我输入 13 '1's。
  3. 我在程序底部的“校验值”总和等于 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/

相关文章:

c - 程序在输出前不等待

c++ - 在图上寻找最短距离——逻辑问题

java - 如何在 Java 中使用 MapStruct 将字符串转换为日期?

javascript - 我需要帮助来尝试获取多维数组的总和

c - 进程的地址空间

c - execlp() 系统调用输出错误

c++ - 在Ubuntu 18.04上找不到MPI_C和MPI cmake

c++ - 将 System::String 转换为 Const Char *

sql - SELECT SUM 在没有记录时返回一行

python - NumPy:按索引分割的一维数组求和