C语言 函数总是返回真

x33g5p2x  于 2023-01-29  发布在  其他
关注(0)|答案(1)|浏览(155)

我有麻烦写一个函数,检查信用卡是否有效,使用卢恩的算法(乘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;
}
ryoqjall

ryoqjall1#

函数number_of_digits的结果被丢弃,这意味着main()中的digits始终为零,您需要将结果存储到digits中:

#include <stdio.h>
#include <cs50.h>

bool luhns_algorithm (long, int);
int number_of_digits(long);

int main (void)
{
  int digits;
  long card = get_long("credit card: ");

  digits = number_of_digits(card); //FIXED

  luhns_algorithm(card, digits);

}

正如你所注意到的,如果digits是unitialize的,那么就会出现一个错误。在函数内部声明的unitialized变量有一个未知的值,如果你在赋值之前尝试使用它们,编译器会显示一个警告。
另外,我可以声明变量digit两次吗?
在C语言中,和大多数语言一样,变量都有作用域。每个变量只能在自己的作用域和下面的作用域中可见。因为你的两个digits变量在不同的作用域中,它们在另一个作用域中不可见。你的main()digits完全独立于你的number_of_digits()digits。更多信息请参见this explanation
还要注意的是,你实际上声明了3次,函数参数的行为就像变量一样,唯一的区别是它是用调用函数时传递给参数的值初始化的。

相关问题