【问题标题】:Control may reach end of non-void function. C控制可能到达非空函数的结尾。 C
【发布时间】:2020-09-28 12:53:16
【问题描述】:

我在此代码的返回行收到上述错误。

// Finds the length of the card number 
int find_length(long long n)
{
    int len;
    for (len = 0; n != 0; n /= 10, len++)
    return len;
}

完整代码:

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



void print_credit_card_brand(long long ccn);
bool check_validity(long long credit_card_number);
int find_length(long long n);
bool checksum(long long ccn);



int main(void)
{
    long long credit_card_number;
    do
    {
        credit_card_number = get_long_long("Enter valid credit card number without spaces or hyphens: ");
    } while (credit_card_number < 0);

    if (check_validity(credit_card_number) == true)
        print_credit_card_brand(credit_card_number);
    else
        printf("INVALID\n");
}



// Checks validity of credit card
bool check_validity(long long credit_card_number)
{
    int len = find_length(credit_card_number);
    return (len == 13 || len == 15 || len == 16) && checksum(credit_card_number);
}



// Finds the length of the card number 
int find_length(long long n)
{
    int len;
    for (len = 0; n != 0; n /= 10, len++)
    return len;
}



// Determines validity using Luhn’s Algorithm
bool checksum(long long ccn)
{
    int sum = 0;
    for (int i =0; ccn != 0; i++, ccn /=  10)
    {
        if (i % 2 == 0)
             sum += ccn % 10;
        else
        {
            int digit = 2 * (ccn % 10);
            sum += digit / 10 + digit % 10;
        }
    }
    return (sum % 10) == 0;
}



// Prints results besed on length of credit card and 1st 2 digits
void print_credit_card_brand(long long ccn)
{
    if ( (ccn >= 34e13 && ccn < 35e13) || (ccn >= 37e13 && ccn < 38e13) )
        printf("AMEX\n");
    else if (ccn >= 51e14 && ccn < 56e14)
        printf("MASTERCARD\n");
    else if ( (ccn >= 4e12 && ccn < 5e12) || (ccn >= 4e15 && ccn < 5e15) )
        printf("VISA\n");
    else
        printf("INVALID\n");
}

【问题讨论】:

  • 提示:如果 n 为 0,你的函数会返回什么?
  • @Alex_2539 你忘记了 for 循环后面的分号。
  • 恕我直言,while 循环会更容易阅读
  • 这就是为什么 always 在每个循环和 if 语句中使用大括号是个好主意。 always 看起来相同的构造更容易理解。你的大脑会立即看到这种模式。不像在这种情况下你的大脑完全错过了模式。
  • 就风格而言,确保始终为循环体使用块有助于避免此类错误,以及其他错误。

标签: c for-loop compiler-errors cs50


【解决方案1】:

您忘记在 for 循环后放置分号。所以有了这个错字,函数看起来像

int find_length(long long n)
{
    int len;
    for (len = 0; n != 0; n /= 10, len++)
    {
        return len;
    }
}

函数可以看如下方式

unsigned int find_length( unsigned long long n )
{
    const unsigned long long Base = 10;
    unsigned int len = 0;

    for ( ; n != 0; n /= Base )
    {
        ++len;
    }

    return len;
}

注意你应该使用无符号整数类型。否则用户可以输入负数,您的程序将产生错误的结果。

【讨论】:

  • 谢谢!我的循环的修订版本返回了相同的错误,但您的重写版本没有。很有帮助!再次感谢!
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多