验证最少2位C语言
我的工作是使用以下各项制作密码验证程序:验证最少2位C语言,c,validation,passwords,C,Validation,Passwords,我的工作是使用以下各项制作密码验证程序: 不允许有空格 1符号 2位数 最少6个字符 最多10个字符 仅上述限制,到目前为止,我已经单独完成了1、2、4、5,并且我无法解决关于2位数字的第三个要求。我只能用1个数字,那么我如何用2个数字呢?我认为正则表达式不象C.中的C++和C语言那样工作,这里是我的代码: #include <stdio.h> #include <string.h> int main(){ char pass[11]; int sto
1
、2
、4
、5
,并且我无法解决关于2位数字的第三个要求。我只能用1个数字,那么我如何用2个数字呢?我认为正则表达式不象C.中的C++和C语言那样工作,这里是我的代码:
#include <stdio.h>
#include <string.h>
int main(){
char pass[11];
int stop;
printf("Give password:\n");
scanf(" %[^\n]s",pass);
do{
if(strlen(pass)<6){
stop=0;
printf("Too short password.");
}
else if(strlen(pass)>10){
stop=0;
printf("Too long password.");
}
else if(strchr(pass, ' ')){
stop=0;
printf("No spaces.");
}
else if((strchr(pass, '$')==NULL && strchr(pass, '#')==NULL && strchr(pass, '@')==NULL && strchr(pass, '!')==NULL && strchr(pass, '%')==NULL && strchr(pass, '*')==NULL)){
stop=0;
printf("Must give at least one of $, #, @, !, %% or *.");
}
else{
stop=1;
printf("Your password is %s\n", pass);
}
}while(stop=0);
return 0;}
#包括
#包括
int main(){
charpass[11];
int stop;
printf(“给出密码:\n”);
scanf(“%[^\n]s”,通过);
做{
if(斯特伦(通过)10){
停止=0;
printf(“密码太长”);
}
否则,如果(strchr(通过“”){
停止=0;
printf(“无空格”);
}
else if((strchr(pass,“$”)==NULL&&strchr(pass,“#”)==NULL&&strchr(pass,“@”)==NULL&&strchr(pass,“!”)==NULL&&strchr(pass,“%”)==NULL&&strchr(pass,“*”)==NULL)){
停止=0;
printf(“必须至少提供美元、#、@、!、%%或*)中的一种);
}
否则{
停止=1;
printf(“您的密码是%s\n”,pass);
}
}while(stop=0);
返回0;}
- 正则表达式搜索输入字符串并全局替换为空
- 验证剩余字符串的长度是否为两个字符
- 这不是一个真正的问题。这里基本上是一个小程序,它检查不同条件下的输入。同样,为了确保有2个数字,让我们创建一个计算数字数的函数。请记住,在ASCII中,数字0到9位于连续块中(这非常重要,您将看到)
为了便于携带。注意,函数isdigit是在ctype.h头中定义的。还有一些改进的余地:
int countDigits(char *input) {
int digitCount = 0;
int noOfCharacters = strlen(input); // avoid strlen() being called
// for every iteration
for (int i = 0; i < strlen(input); i++) // for every character
digitCount += isdigit(input[i]);
return digitCount;
}
int countDigits(字符*输入){
int-digitCount=0;
int noOfCharacters=strlen(输入);//避免调用strlen()
//每次迭代
对于(int i=0;i
现在您只需要使用这个函数,并检查它是否为您得到的输入返回2
pass[11]
// char pass[11];
char pass[100];
scanf(" %99[^\n]",pass);
int cnt = 0;
for (i=0; pass[i]; i++) {
if (pass[i] >= '0' && pass[i] <= '9') cnt++;
}
if (cnt != 2) BadPsss();
int cnt=0;
for(i=0;通过[i];i++){
如果(pass[i]>='0'&&pass[i]你能想出一种计算数字的方法吗?注意:从中删除s
(“%[^\n]s”
。这是不需要的。复杂的密码规则通常不会产生更安全的密码,重要的是密码的最小长度。人们记不住大量的强密码,这样的规则可能会干扰良好的密码方案。人们可以很有创意地绕过这些规则,例如使用“password-2014”这样的弱密码。通常情况下,您的密码会变弱,而不是变强。在任何情况下,您都应该删除10个字符的上限。if(isdigit(输入[i])
并不比if(输入[i]>='0'&&input[i]好好的,@Paul92谢谢,你的回答让我想得更清楚了!我以为这是正则表达式..因为我在C#和Java中看到了一些类似的验证代码,他们用正则表达式进行验证…不管怎样,现在我很好,它工作得很好。你能告诉我为什么使用无限长输入很危险吗?还有小的缓冲区,我不明白为什么是100?我的字符串最大值为10+\0=11,所以pass[11]可以。有什么问题吗?@Sotnam96我看你们都准备好接受答案了。嗯。哦,好吧。如何使用代码来获得“太长的密码”?当然输入了比10长的内容,如“12345678901”。这需要11+1char
来保存,填充过多char pass[11]
。您的代码今天没有崩溃,否则您会对此采取一些措施,但它确实过量填充了缓冲区-谁知道会损坏什么。因此,您需要一个大于pass[11]
的缓冲区来测试字符串长度>10。@Sotnam96scanf(“%[^\n]”,pass)的危险之处在于
?正如您所经历的,对正确代码的错误感觉。黑客的许多安全漏洞利用了这样的代码。关于这种黑客行为,有很多帖子都是这样写的。健壮的代码可以防止缓冲区溢出。使用char pass[100];…scanf(“%99[^\n]”,pass);
按照建议,将用户输入限制为99char
,因为99+1('\0'
)char
可以保存。如果用户输入的字符数超过99char
,则最多只能读取99char
,而额外的输入仍保留在stdin
中。至少pass
不会被过度填充。
scanf(" %99[^\n]",pass);
int cnt = 0;
for (i=0; pass[i]; i++) {
if (pass[i] >= '0' && pass[i] <= '9') cnt++;
}
if (cnt != 2) BadPsss();