C "control may reach end of non-void function" 错误中的布尔函数

Boolean Functions in C "control may reach end of non-void function" error

我在编译代码时总是在布尔函数上得到“控制可能到达非空函数的结尾”,但不知道是什么原因造成的。

这是代码,谢谢

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

bool digit_validation (string s);

int main (int argc, string argv[])
{
    
    if((argc == 2) && (digit_validation(argv[1]) == true))
    {
        int key = atoi(argv[1]);
        printf("%i\n", key);
    }
    
    else
    {
        printf("Usage: ./caesar key\n");
    }

}

bool digit_validation (string s)
{
for (int i = 0, lenght = strlen (s); i < lenght; i++ )
{
    if(isdigit(s[i]))
    {
        return true;
        break;
    }
    
    else
    {
        return false;
    }
}
}

我认为你的第二个函数有点混乱,但很容易解决:

bool digit_validation(string s) {
  size_t length = strlen(s);

  for (size_t i = 0; i < length; i++) {
    if (isdigit(s[i])) {
      return true;
    }
  }        

  return false;
}

正如其他人所观察到的,您的循环可能已被跳过,这将导致到达函数末尾而不返回任何内容。作为一般规则,您希望构建代码以使退出点显而易见,而您的原始情况并非如此。

这还没有检测到“所有数字”,您仍然需要通过反转逻辑来解决这个问题:

bool digit_validation(string s) {
  size_t length = strlen(s);

  if (!length) {
    return false;
  }

  for (size_t i = 0; i < length; i++) {
    if (!isdigit(s[i])) {
      return false;
    }
  }        

  return true;
}

编译器警告函数 digit_validation 可能最终“脱离”函数 - 不返回任何值。如果调用者使用该值,就像您的代码中发生的那样,它会导致 undefined behaviour.

例如,如果你传递一个空字符串"",那么length就是0,根本不会进入for循环。

digit_validation还有其他问题

  • 如果传递空指针,strlen就会有问题

  • 它实际上并没有验证所有字符都是数字;一旦找到第一个数字,函数 returns 不检查其余数字。

可以固定为:

bool digit_validation (string s)
{
    if (!s || !s[0]) return false;

    for (size_t i = 0; s[i]; ++i) {
        if(!isdigit((unsigned char)s[i])) return false;
    }
  
    return true;
}

几点:

  • isdigit 的参数(以及一般的所有 ctype 函数)需要转换为 unsigned char 以避免 undefined behaviour in case of negative values.

  • 鉴于s是一个字符串,你可以避免使用strlen来计算长度,而是使用sentinel null字节(strlen 将检查相同的内容)。