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

C中的布尔函数“控制可能达到非空函数的结尾”错误,c,function,boolean,cs50,C,Function,Boolean,Cs50,在编译代码时,我一直在控制布尔函数上的非void函数,但不知道是什么导致了这种情况 这是密码,谢谢 #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

在编译代码时,我一直在控制布尔函数上的非void函数,但不知道是什么导致了这种情况

这是密码,谢谢

#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;
}

编译器警告说,函数数字\u验证可能会在不返回任何值的情况下从函数中脱落。如果调用方使用该值,正如代码中所发生的那样,则会导致错误

例如,如果传递一个空字符串,则长度为0,并且根本不输入For循环

数字验证还有其他问题

如果传递空指针,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;
}
几点:

isdigit的参数和所有ctype函数通常需要转换为无符号字符以避免

假设s是一个字符串,您可以避免使用strlen来计算长度,而是使用sentinel空字节strlen来检查相同的长度


主函数是否返回任何内容?如果没有输入for,函数将不会返回值长度为0。对于for语句,我尤其感到困惑,因为其中包含If,两者都退出。如果在第一次迭代中要保证保释,为什么要循环呢?当Ds是空字符串时,DigiTalk验证函数将不执行返回语句。PSA:长度不长。这是C,而不是C++。还有,为什么你用int表示i,而用size\u t表示长度?@MikeCAT我真的,真的,真的很鄙视CS50。另外,在for should be@MikeCAT已修复。根据代码上下文,如果s是一个包含一个或多个数字且仅包含数字的字符串,则digit_验证应返回true。如果s包含数字,则此答案中的代码返回true,即使它包含非数字。谢谢,这很有帮助。知道如何验证所有字符都是数字吗?更新了如何修复函数中的这些问题。