下面的函数对给定的卡号执行 Luhn 算法,但会抛出一些卡号的运行时错误。试图理解为什么?

The below function performs Luhn's Algorithm on a given card number, but throws up runtime error with some card numbers. Trying to understand why?

我在 运行 下面的函数中对任何给定的卡号进行求和校验(Luhn 算法),但对某些卡号的校验失败并且还会抛出运行时错误:"Index out of bounds for type 'int[count]'." 我我猜这是关于数组 odd/even 但无法弄清楚的原因。

已经尝试 运行 循环到各种计数,如 count+1 和 count-1 等

int sum1 = 0;
int sum2 = 0;    
int count = digit_counter(cc_num);
int hold[count];

for(int i=0; i<count; i++)
{
   hold[i]= cc_num%10;
   cc_num = cc_num/10;  
}

for(int i=0; i<count; i++)
{
    printf("%i\n",hold[i]);    
}    

int i,j;
for (i=1,j=0; i<=count || j<count; i+=2,j+=2)
{
    hold[i] = hold[i]*2;
    if (hold[i]>10)
    {
        sum1+= (hold[i]/10)+(hold[i]%10);
    }
    else
    {
        sum1+= hold[i];
    }  
    sum2+=hold[j];

}
return sum1+sum2;

不应抛出任何运行时错误,并且能够对所有卡片执行 sumcheck。

试试这个

int sum = 0;
bool odd = true;
for (int i = data.Length - 1; i >= 0; i--)
{
    if (odd == true)
    {
        int tSum = Convert.ToInt32(data[i].ToString()) * 2;
        if (tSum >= 10)
        {
            string tData = tSum.ToString();
            tSum = Convert.ToInt32(tData[0].ToString()) + Convert.ToInt32(tData[1].ToString());
        }
        sum += tSum;
    }
    else
        sum += Convert.ToInt32(data[i].ToString());
    odd = !odd;
}
return (((sum / 10) + 1) * 10) - sum;

如前所述,您的循环有错误的停止条件。假设你的 cc_num 在没有 Luhn 的情况下保持平底锅并且你的 digit_counter 工作正常你可以尝试类似的东西:

int i;
for (i=0; i<count; ++i)
{
    bool isDouble=(count - i) % 2 != 0;
    sum1 += isDouble ? 2 * hold[i] % 10 + 2 * hold[i] / 10 : hold[i];
}
return 9 * sum1 % 10;