好的,所以我一直在观看Bucky Robert关于C编程的教程,他给观众的第一个任务是创建一个程序来检查密码是否至少包含一个大写字符,一个数字和一个美元符号。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main()
{
int upper = 0;
int digit = 0;
int dollar = 0;
char password[16];
int loop = 1;
while(loop == 1){
printf("Enter your password: ");
scanf(" %s", password);
int i;
for(i = 0; i <= 16; i++){
printf(" %c", password[i]);
if(isupper(password[i])){
upper = 1;
printf("\t is upper");
}
if(isdigit(password[i])){
digit = 1;
printf("\t is digit");
}
if(password[i] == '$'){
dollar = 1;
printf("\t is dollar");
}
printf("\n");
}
if((upper == 1) && (digit == 1) && (dollar == 1)){
printf("Your password is valid\n");
loop = 0;
} else {
printf("Your password is invalid\n");
}
}
return 0;
}
在输入&#39; P4sswoRd&#39;
后,程序会在控制台中打印出来 Enter your password: P4sswoRd
P is upper
4 is digit
s
s
w
o
R is upper
d
╨
@
ö
`
$ is dollar
Your password is valid
我输入的所有密码均未包含&#39; $&#39;字符,但程序仍然找到一种方法来检测它。它打印的原因是&#34;是数字&#34;或&#34;是美元&#34;在角色检查代码中出现了什么问题后,看看为什么密码都是有效的。我不知道为什么所有这些随机字符都被打印出来,我宁愿知道我的程序出了什么问题,而不是采用新的方法完成手头的任务。
答案 0 :(得分:3)
这个循环错了:
for(i = 0; i <= 16; i++){
如果只输入4个字符,则只应检查字符串的前4个字符。这就是为什么你会看到很多随机字符 - 那些是password
剩余元素中的垃圾。它应该是:
size_t pw_len = strlen(password);
for (i = 0; i < pw_len; i++) {
另外,请记住,由于数组是从零开始的,因此数组的最后一个元素的索引长度为1。因此,如果您确实要处理声明为password[16]
的数组的所有元素,则循环条件应为i < 16
,而不是i <= 16
- 这将尝试在最后一个数组外部访问迭代。
您还需要在upper
循环的开头初始化digit
,dollar
和while
变量。否则,如果您输入带有数字和$
的密码,然后是带有鞋面的新密码,则第二个密码将被称为有效,因为它仍然具有之前的digit
和dollar
设置密码。
所以它应该是:
while(loop == 1){
upper = digit = dollar = 0;