我昨天刚开始学习C,我被要求将这个小程序写成培训,它测量密码是否足够强
int main()
{
char password[20];
int spec, upper, i;
printf("Please enter a password between 6 to 20 characters:\n");
scanf(" %c", &password);
for(i=0, i<=20 , i++){
if(isupper([i])){
upper+=1;
}else{
if(isdigit([i])){
upper+=1;
}
else{
spec++;
}
}
if((spec+upper)>2){
printf("Secure password");
}else{
printf("Please change your password");
}
return 0;
}
答案 0 :(得分:1)
你的一些条件不好,它不是[i]而是密码[i],在scanf中它是%s而不是%c,没有&amp ;. 有一个}缺失,spec和upper没有初始化。
一个例子:
#include <stdio.h>
#include <ctype.h>
int main()
{
char password[20];
int spec = 0;
int upper = 0;
int i;
printf("Please enter a password between 6 to 20 characters:\n");
scanf(" %s", password);
for(i=0; i<20 ; i++){
if(isupper(password[i])){
upper++;
}else if(isdigit(password[i])){
spec++;
}
}
if(spec > 0 && upper > 0){
printf("Secure password");
}else{
printf("Please change your password");
}
return 0;
}
答案 1 :(得分:0)
将spec
和upper
变量初始化为0。
作为int spec=0, upper=0;
并由 Haris 评论:
使用%s
代替%c
答案 2 :(得分:0)
你需要在任何地方写密码[i]而不是[i]。
答案 3 :(得分:0)
让我们列举这段代码的所有问题:
password[i]
来访问i
的{{1}}元素。password
将循环使用最终值for(i=0, i<=20 , i++)
并且当您的数组时有20个元素,最后一个有效索引是20
。19
,scanf()
转换说明符用于转换一个字符。您可以使用例如c
表示最多20个字符的单词或"%20s"
也可以使用空格和制表符。更简单的方法是使用"%20[^\n]"
来读取输入的行。fgets()
变量是一个变小。 password
终结符需要一个额外的字符来标记字符串的结尾。 (对于'\0'
,它将再次需要一个字符,因为fgets()
也会在一行的末尾读取换行符。)更正后的版本可能如下所示:
fgets()
答案 4 :(得分:0)
scanf(" %c", &password);
只会将1个字符读入password[]
。
代码可以尝试
char password[20];
printf("Please enter a password between 6 to 20 characters:\n");
fflush(stdout);
scanf("%19s", &password);
然而,这也存在问题。
是否未读取用户输入的行。
密码中的空格不会保存在password[]
数组需要大1才能接受20个字符。
高级问题:使用隐藏缓冲区的代码读取密码会在内存中留下密码副本。安全系统使用特殊的输入函数来擦除缓冲区内容以避免这种情况。因此,使用"%c"
读取1个字符对于"%s"
调用的缓冲区来说是一个好主意。下面使用fgetc()
来最小化难以擦除的函数缓冲区。
#include <ctype.h>
#include <stdio.h>
#define PW_MIN 6
#define PW_MAX 20
int main() {
// allow for 1 extra character to be read and null character
char password[PW_MAX + 1 + 1];
unsigned length = 0;
unsigned upper_digit = 0; // Initialize these to 0
unsigned spec = 0;
int ch;
printf("Please enter a password between %d to %d characters:\n", PW_MIN, PW_MAX);
fflush(stdout);
while ((ch = fgetc(stdin)) != '\n' && ch != EOF) {
if (length + 1 < sizeof password) {
if (isupper(ch)) upper_digit++;
else if (isdigit(ch)) upper_digit++;
else spec++;
password[length++] = ch;
}
}
if (length >= PW_MIN && length <= PW_MAX && (spec + upper_digit) > 2) {
puts("Secure password");
// use password somehow
} else {
puts("Please change your password");
}
// scrub data.
memset(password, 0, sizeof password);
length = upper_digit = spec = 0;
ch = 0;
return 0;
}
我怀疑OP的(spec + upper_digit) > 2
测试是错误的,但现在仍然是这样。
答案 5 :(得分:0)
这是解决方案的人:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main()
{
char password[20];
int spec=0, upper=0, digit=0,test=0,pwdlength=0;
int i;
printf("Please enter a password between 6 to 20 characters:\n");
while(test!=1){
scanf(" %s", password);
pwdlength = strlen(password);
while((pwdlength<6) || (pwdlength>20)){
printf("Please enter a password with a length between 6 and 20 chars:");
scanf(" %s", password);
pwdlength = strlen(password);
}
for(i=0; i<=pwdlength ; ++i){
if(isupper(password[i])){
upper++;
}else if(isdigit(password[i])){
digit++;
}else if(isalpha(password[i])){
continue;
}else{
spec++;
}
}
if((spec+upper+digit)>=3){
printf("Your password is strong enough \n");
printf("Password length is: %d", pwdlength);
test=1;
}else{
printf("Please type a new password:");
}
}
return 0;
}