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
将检查相同的内容)。
我在编译代码时总是在布尔函数上得到“控制可能到达非空函数的结尾”,但不知道是什么原因造成的。
这是代码,谢谢
#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
将检查相同的内容)。