我试图让我的程序检查为password_entered输入的值中是否有一个数字。
我目前有一个c,它看起来像:
int CFD(char password_entered[]);
int main()
{
char password_entered[20]; //max is 20 char
/*do{*/
printf("password?? \n");
scanf("%s", password_entered);
if(CFD(password_entered))
{
//contains digit(s) character.
}
else{
// no digits
}
/*}*/
return 0;
}
int CFD(char password_entered[]){
int i;
for(i=0; i<strlen(password_entered); i++){
if( isdigit(password_entered[i]) ){
printf("\ndigit(s).\n");
return true;
}
else{
printf("\nno digit(s).\n");
return false;
}
}
}问题是,当我运行我的代码时,它总是掉进else{}中,我在这里做错了什么?
问题的一部分是,如果我输入了3,它可以工作,但不能使用John3 --我如何更好地评估这个问题呢?
谢谢!
发布于 2015-08-27 20:29:18
您只测试密码的第一个字符,然后立即返回。试试这个:
int CFD(char password_entered[]) {
int i;
for (i=0; i<strlen(password_entered); i++) {
if ( isdigit(password_entered[i]) ) {
printf("\ndigit(s).\n");
return 1;
}
}
printf("\nno digit(s).\n");
return 0;
}发布于 2015-08-27 20:32:37
你的CFD功能就是这么做的
for each character in the password
if that character is a digit
then don't process any more characters, just return true
otherwise don't process any more characters, just return false你现在能看到问题了吗?你不可能知道密码中的任何一个字符都是数字,直到你看完它们!
你真的想要这样的东西:
for each character in the password
if that character is a digit
then don't process any more characters, just return true
if we get down here we know we've checked every character so return false发布于 2015-08-27 20:28:55
我想这取决于您提供的输入,但是您的代码中有一个逻辑错误.
您的CFD函数“希望”迭代密码,但是不管它找到哪种类型的字符,它都会立即返回,这在处理第一个字符时会发生。
要解决这个问题,请尝试如下:
int CFD(char password_entered[]){
int i;
int hasdigits = 0;
for(i=0; i<strlen(password_entered); i++){
if( isdigit(password_entered[i]) ){
printf("%c - digit\n", password_entered[i]);
hasdigits = 1;
}
else{
printf("%c - no digit\n", password_entered[i]);
}
}
return hasdigits;
}或者,如果您不希望打印,并希望尽快停止:
int CFD(char password_entered[]){
int i;
for(i=0; i<strlen(password_entered); i++){
if( isdigit(password_entered[i]) ){
return 1;
}
}
return 0;
}而且,无论您选择什么解决方案,重复调用strlen都是浪费的。您可以“向后走”,也可以使用一个变量来保持这样的长度:int i, l; for(i=0,l=strlen(password_entered); i<l; i++)。
https://stackoverflow.com/questions/32258781
复制相似问题