C函数不';t返回字符串,尽管它应该返回

C函数不';t返回字符串,尽管它应该返回,c,return,cs50,C,Return,Cs50,我是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_

我是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;
}
#包括
#包括
#包括
#包括
内伦(隆北);
字符*检查(长nu);
内部主(空)
{
long number=get_long(“number:”);
printf(“%s”,复选框(数字));
}
内伦(长北)
{
整数长度,步长,num;
长十;
步骤1=0;
长度=地板(log10(实验室(n))+1;
对于(int i=length,加电=1;i>length/2;i--)
{
tens=功率(10,通电);
num=((n/tens)%10)*2;
如果(地板(对数10(绝对值(数值)))+1>1)
{
while(num)
{
步骤1+=num%10;
num/=10;
}
步骤1+=num;
加电+=2;
}
其他的
{
步骤1+=num;
加电+=2;
}
}
对于(int i=length,加电=0;i>length/2;i--)
{
tens=功率(10,通电);
num=((n/tens)%10);
步骤1+=num;
加电+=2;
}
如果(第1步%10==0)
{
返回1;
}
其他的
{
返回0;
}
}
字符*检查(长nu)
{
int l,前两位,前一位;
l=楼层(log10(实验室(nu))+1;
第一个=nu/1000;
前两位=nu/100;
char*answer=NULL;
如果(l==15)
{
if(前两位=34 | |前两位=37)
{
如果(lunh(nu)==1)
{
答复=“美国运通”;
}
其他的
{
回答=“无效”;
}
}
}
else if(l==13 | | first|u one==4)
{
如果(lunh(nu)==1)
{
回答=“VISA”;
}
其他的
{
回答=“无效”;
}
}
else如果(l==16)
{
如果(前两位==51 | |前两位==52 | |前两位==53 | |前两位==54 | |前两位==55)
{
如果(lunh(nu)==1)
{
回答=“万事达卡”;
}
其他的
{
回答=“无效”;
}
}
}
其他的
{
回答=“无效”;
}
printf(“%s”,答案);
返回答案;
}
输入:4003600000000014 预期输出:“VISA”
当前输出:无,输入数字后,程序停止。

这里至少有一个问题:
如果(l==13 | | first | u one==4)
。根据规范:

  • Visa使用13位和16位数字
  • 签证号码都以4开头

如果长度为13或卡片以4开头,则if测试将生成VISA。示例输入是一个16位数字。

显示示例输入、观察到的输出和期望的输出,并解释“不返回字符串”的含义。提供一个示例。另外,编辑你的帖子,让它提出问题,最好使用一个以问号结尾的句子。在我看来,
enum
char*
@blur更适合于返回值类型。函数似乎返回一个空字符串,最初用于初始化指针答案。@EricPostDischil输入是一个卡号,还有另一个函数验证卡号的校验和,如果无效,则返回0,如果有效,则返回1,并且工作正常(返回预期值)。您需要准确显示示例输入-**特定**输入,不提供说明。并提供样本输出,准确复制粘贴。并显示您期望的输出。并在问题中粘贴一个完整的程序来重现问题。