为什么最后一个元素没有追加到我的数字数组中?

布雷登·高尔

嗨,我是“ C”的新手,我对我得到的某些输出有疑问。

我们正在处理的数字为:[ 4003600000000014 ]。除了一个我不确定如何获取最后一个要打印的数字,我将每个元素附加到此数组。

我对数字6422180感到好奇,不确定是否可以解释。

输出值

// This is an example of Luhn's algorithm.

#include <stdio.h>
#include <ctype.h>

#define MAX_CRED_LEN 16

// Function prototypes.
void payment_method();

int main(void)
{   
    payment_method();
    return 0;
}

long long int get_credit_card_num()
/*
    Gets the users credit card number.
*/
{
    long long int d;

    do
    {
        printf("\nPlease enter in your credit card number: ");
        if (scanf("%lld", &d) == 1)
        {
            printf("\nYour credit card number: (%lld)\n%s", d,
                "------------------------\n\n");
            continue;
        }
        else
        {
            printf("\n\tINVALID INPUT CHARACTER ENTERED PLEASE TRY AGAIN!\n%s",
                "\t*************************************************");
            fflush(stdin); // Clear input buffer of any characters!
            get_credit_card_num(); // Start the function again to prompt user.
        }
    } while (d < 0);

    return d;
}

int num_of_ccdigits()
/*
    Counts the amount of digits the user entered. Then compares the number of
    digits to a specific length offered by cardholders they are 13, 15, and 16
    digits long.
*/
{
    long long int cc_num = get_credit_card_num();
    int digits = 0, arr[MAX_CRED_LEN];

    // Count how many digits the user entered then compare the length.
    while (cc_num != 0)
    {
        cc_num /= 10;
        arr[digits] = cc_num % 10;
        digits++;
    }
    // Display the number of digits that the user entered.
    printf("\nNumber of digits: [%i]", digits);
    int a = 0, i;
    for (i = 0; i < digits; i++)
    {
        printf("\n[%d]:\tYOUR DIGIT ARRAY: %i", a, arr[i - 1]);
        ++a;
    }
    printf("\n\nARRAY WITHOUT LINE BREAKS: %i", arr);
    // Check to see if this is a valid credit card number or a supported one.
    if ((digits != 13) && (digits != 15) && (digits != 16))
    {
        printf("\n\tMUST BE AT LEAST 13, 15, AS HIGH AS 16 DIGITS.\n%s",
            "\t**********************************************\n");
        // if no 13, 15, or 16 digits long restart loop.
        num_of_ccdigits();
    }

    return digits; // return the amount of digits in the credit card number.
}

void payment_method()
{
    int num_of_digits = num_of_ccdigits();

}
戈戈伦

我在这里看到一些问题。对于第一个问题,代码在的范围之外建立了索引arr,从而导致未定义的行为:

for (i = 0; i < digits; i++)
{
    printf("\n[%d]:\tYOUR DIGIT ARRAY: %i", a, arr[i - 1]);
    ++a;
}

在第一次迭代中,i = 0我们继续索引arr[0 - 1]arr[-1]哎呀 这可能会产生垃圾值或导致崩溃(或其他情况)。

顺便说一句,a这里是多余的-仅用于i获取索引(必须诉诸a于获取索引的气味,好像有些东西关闭了)。arr[i - 1]技巧可能已经完成,以弥补另一个bug:

while (cc_num != 0)
{
    cc_num /= 10;
    arr[digits] = cc_num % 10;
    digits++;
}

这里的问题是cc_num /= 10;说“移至下一位”。但这会完全跳过第一个数字。应该是:

while (cc_num != 0)
{
    arr[digits] = cc_num % 10;
    digits++;
    cc_num /= 10;
}

可以通过打开警告来识别的另一个问题是

ARRAY WITHOUT LINE BREAKS: -1747166688

在这里,编译器告诉我们问题所在:

$ clang-7 -o main main.c
main.c:67:49: warning: format specifies type 'int' but the
      argument has type 'int *' [-Wformat]
    printf("\n\nARRAY WITHOUT LINE BREAKS: %i", arr);
                                           ~~   ^~~
1 warning generated.

要转储数组的值,请使用循环并分别打印每个元素。


其他说明:

  1. 无效的用户条目会导致无限循环。
  2. 将功能分解为功能很好,但是要避免功能的副作用,尤其是打印。例如num_of_ccdigits,除了简单地获取信用卡位数外,还可以做很多事情。它还执行验证和I / O。如果删除打印语句并使它仅负责计算数字中的数字,则可以对其count_digits(long long int num)进行重命名并使其可在任何位置重用long long int然后,在其他地方(例如print_digits(long long int num)和)进行打印和验证validate_cc_digit_length(long long int num)找出单一责任原则
  3. 我对功能的目的有点困惑

    void payment_method()
    {
        int num_of_digits = num_of_ccdigits();
    }
    

    函数名称通常是描述函数功能的动作,而不是名词(通常是变量)。考虑类似的东西get_payment_method()

    同样,由于num_of_ccdigits对坏数据进行递归调用,因此有可能导致堆栈溢出。使用while循环是处理可能会无限运行的错误输入的更好方法。

  4. 对于像这样的初始化:

    int digits = 0, arr[MAX_CRED_LEN];
    

    喜欢:

    int digits = 0; 
    int arr[MAX_CRED_LEN];
    

    这更容易阅读。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift:为什么在使用追加时没有元素添加到我的数组中?

为什么数组中的最后一个元素会覆盖所有先前的元素?

为什么我的数组列表没有保留最后一个答案?

为什么没有删除该列表中的最后一个数字?

为什么我只能引用传递给onClickListener的TextView数组中的最后一个元素

为什么链表的最后一个元素没有出现在输出中?

我在链表中添加了4个元素,但是为什么只显示了三个,而最后一个元素没有打印出来

为什么 .push() 方法会重复添加到数组中的最后一个元素的值?

为什么只有最后一个元素显示数组而不是JavaScript中的所有元素

为什么我的p元素在最后一个之后立即跟随而又没有间断?

在Python中,为什么我的for循环仅当该数字是数组中的最后一个数字时才排除该数字之前的数字?

为什么当我尝试使用python计算数组中的数字数量时,其中一个数组进行错误检查

将一个数字加到存储在数字数组中的数字

为什么数组中的每个元素都会自动变成最后一个元素?

为什么我只能在while循环之外获取数组的最后一个元素

为什么我的代码只比较数组的第一个和最后一个数字 - Java

为什么我的字典没有被添加到我的数组中?indexPath.row 返回 nil

为什么我需要添加双引号来打印java中char数组的第一个和最后一个元素

为什么我的最后一个分歧没有被执行?

为什么我的最后一个 else 条件没有正确执行

为什么列表中没有tail()或head()方法来获取最后一个或第一个元素?

为什么此代码仅显示数组中的最后一个元素?

为什么我不能在 td 或 tr 标签中定位一个没有 html 中的 table 标签的元素?

为什么awk split()使第一个字段成为数组中的最后一个元素?

为什么我的for循环会跳过数组中的最后一个值?

从数字数组中获取一个数字

Swift-为什么我的JSON对象元素仅添加最后一个数组元素?

为什么最后一个命令变量“ _”没有出现在dir()中?

为什么最后一个文本块没有出现在块内容中?