【发布时间】:2020-08-12 14:38:40
【问题描述】:
我是 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 预期输出:“签证” 当前输出:无,输入数字后程序停止。
【问题讨论】:
-
显示示例输入、观察到的输出、您期望的输出,并解释“不返回字符串”的含义。提供minimal reproducible example。此外,编辑您的帖子,使其提出问题,最好使用以问号结尾的句子。
-
在我看来,
enum在这里的返回值类型比char*更好。 -
@blur 该函数似乎返回了一个空字符串,该字符串最初用于初始化指针答案。
-
@EricPostpischil 输入是一个卡号,还有另一个函数可以验证卡号的校验和,如果无效则返回 0,如果有效则返回 1,并且它工作正常(返回预期的结果)跨度>
-
您需要准确显示示例输入——**特定**输入——而不是对其进行描述。并提供样本输出,完全复制和粘贴。并显示您期望的输出。并将重现问题的完整程序粘贴到问题中。