C функция не возвращает строку, хотя должна - PullRequest
0 голосов
/ 28 апреля 2020

Я супер новичок в C, пытаюсь решить проблему кредита CS50 здесь. Поэтому я написал функцию, которая должна проверять некоторые параметры и возвращать строку, которую я использую в основной функции для вывода ответа.

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


int lunh(long n);
char* check(long nu);


int main(void)
{
    long number = get_long("Number: ");
    printf("%s", check(number));
}


int lunh(long n)
{
    int length, step_one, num;
    long tens;
    step_one = 0;
    length = floor(log10(labs(n))) + 1;
    for (int i = length, powering = 1; i > length / 2; i--)
    {
        tens = pow(10, powering);
        num = ((n / tens) % 10) * 2;
        if (floor(log10(abs(num))) + 1 > 1)
        {
            while (num)
            {
                step_one += num % 10;
                num /= 10;
            }
            step_one += num;
            powering += 2;
        }
        else
        {
            step_one += num;
            powering += 2;
        }
    }
    for (int i = length, powering = 0; i > length / 2; i--)
    {
        tens = pow(10, powering);
        num = ((n / tens) % 10);
        step_one += num;
        powering += 2;
    }
    if (step_one % 10 == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


char* check(long nu)
{
    int l, first_two_digits, first_one;
    l = floor(log10(labs(nu))) + 1;
    first_one = nu / 1000;
    first_two_digits = nu / 100;
    char* answer = NULL;
    if (l == 15)
    {
        if (first_two_digits == 34 || first_two_digits == 37)
        {
            if (lunh(nu) == 1)
            {
                answer = "AMEX";
            }
            else
            {
                answer = "INVALID";
            }
        }
    }
    else if (l == 13 || first_one == 4)
    {
        if (lunh(nu) == 1)
            {
                answer = "VISA";
            }
        else
        {
            answer = "INVALID";
        }
    }
    else if (l == 16)
    {
        if (first_two_digits == 51 || first_two_digits == 52 || first_two_digits == 53 || first_two_digits == 54 || first_two_digits == 55)
        {
            if (lunh(nu) == 1)
            {
                answer = "MASTERCARD";
            }
            else
            {
                answer = "INVALID";
            }
        }
    }
    else
    {
        answer = "INVALID";
    }
    printf("%s", answer);
    return answer;
}

Ввод: 4003600000000014 Ожидаемый выход: «VISA» Токовый выход: ничего, после ввода числа программа останавливается.

1 Ответ

0 голосов
/ 30 апреля 2020

Здесь есть как минимум одна проблема: else if (l == 13 || first_one == 4). От spe c:

  • Visa использует 13- и 16-значные git числа.
  • Все номера Visa начинаются с 4

Если тест выдаст VISA, если длина составляет 13 или карта начинается с 4. Образец ввода представляет собой число 16 di git.

...