C中的布尔函数“控制可能到达非空函数的结尾”错误

-1 c boolean function cs50

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

这是代码,谢谢

#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;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

P.P*_*.P. 5

编译器警告该函数digit_validation可能最终“脱离”该函数 - 不返回任何值。如果调用者使用该值,正如它在您的代码中发生的那样,它会导致未定义的行为

例如,如果您传递一个空字符串""length则为 0 并且for根本不进入循环。

digit_validation 也有其他问题。

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

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

它可以修复为:

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;
}
Run Code Online (Sandbox Code Playgroud)

几点:

  • 的参数isdigit(以及一般的所有 ctype 函数)需要强制转换unsigned char为避免在负值的情况下出现未定义的行为

  • 鉴于这s是一个string,您可以避免使用strlen来计算长度,而是使用哨兵空字节(strlen毕竟会检查相同)。