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