【问题标题】:Sum of numbers in string is not correct - cs50, basic C字符串中的数字总和不正确 - cs50,基本 C
【发布时间】:2014-09-02 18:18:10
【问题描述】:

第一次在这里提问。我正在参加一个在线课程 (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'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 - 这是检查号码是否有效的一部分,我还没有实现。我必须从倒数第二个数字开始每隔一个数字相乘。

标签: c string sum cs50


【解决方案1】:

for (int i = l - i; i &gt;= 0; i--) i = 13 在第一次迭代中,但您对number 的声明是:

int number[l]

这使您可以访问数组索引 0..12(当 l=13 时),并且 13 超出了数组的末尾...这会导致从内存中的其他位置添加一个随机值,超出最后一个位置number 的堆栈分配。

如果将循环更改为:

for (int i = l - 1; i >= 0; i--)

那你就不会有这个问题了。

【讨论】:

  • 嗯,M Oehm,没有意识到我在引用“我”本身。我认为你是对的,我应该每次递减 1,而不是变量本身。我会试试这个。
  • 就是这样 - 只需将其更改为 l - 1 而不是 -i。现在似乎很明显 - 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2013-01-11
  • 1970-01-01
  • 2018-04-09
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多