我有麻烦写一个函数,检查信用卡是否有效,使用卢恩的算法(乘2每隔一位数,从倒数第二开始;把没有乘以2的数字相加;如果总数的最后一位是0,则该数字有效)。
当我开始写代码时,我检查了这些行:
long number2 = ((card % x) / y)\*2;
long number1 = ((card % (x/10)) / (y/10));
而且它们看起来工作正常。当我现在再次尝试检查时,它有点忽略以下几行:
x一个一个一个一个x一个一个二个x
函数总是返回真,另外,我声明变量digits
两次可以吗?
#include <stdio.h>
#include <cs50.h>
bool luhns_algorithm (long, int);
int number_of_digits(long);
int main (void)
{
int digits = 0;//if i remove this then on line 15 appears mistakes
long card = get_long("credit card: ");
number_of_digits(card);
luhns_algorithm(card, digits);//use of undeclared identifier 'digits'; variable 'digits' is uninitilazed when used here
}
int number_of_digits(long card)
{
int digits = 0;//cant be used in do while loop if undeclared and uninitialized so I need to write it twice
do
{
digits++;
card = card/10;
} while(card != 0);
printf("%i\n", digits);
return digits;
}
bool luhns_algorithm (long card, int digits)//always valid for some reason
{
int sum = 0;
long x = 100;
long y = 10;
for (int i = 0; i < digits/2; i++)
{
long number2 = (card % x)/y;
long number1 = (card % (x/10))/(y/10);
printf("%li\n", number1);//doesn't work
printf("%li\n", number2);//doesn't work
sum = sum + number2 + number1;
printf("%i\n", sum);//doesn't work
x = x*100;
y= y*100;
}
if((sum/10) == 0)
{
printf("VAlID\n");
return true;
}
printf("INVALID\n");
return false;
}
1条答案
按热度按时间ryoqjall1#
函数
number_of_digits
的结果被丢弃,这意味着main()
中的digits
始终为零,您需要将结果存储到digits
中:正如你所注意到的,如果
digits
是unitialize的,那么就会出现一个错误。在函数内部声明的unitialized变量有一个未知的值,如果你在赋值之前尝试使用它们,编译器会显示一个警告。另外,我可以声明变量
digit
两次吗?在C语言中,和大多数语言一样,变量都有作用域。每个变量只能在自己的作用域和下面的作用域中可见。因为你的两个
digits
变量在不同的作用域中,它们在另一个作用域中不可见。你的main()
digits
完全独立于你的number_of_digits()
digits
。更多信息请参见this explanation。还要注意的是,你实际上声明了3次,函数参数的行为就像变量一样,唯一的区别是它是用调用函数时传递给参数的值初始化的。