我的工作是使用以下方法制作密码验证器:
只是上述限制,到目前为止,我单独完成了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;}
答案 0 :(得分:0)
[^0-9]
输入字符串并全部替换为空。答案 1 :(得分:0)
那不是真正的regex。你有什么基本上是一个小程序,检查其输入的不同条件。所以,以同样的方式,为了确保你有2位数,让我们创建一个计算位数的函数。请记住,在ASCII中,数字0到9是连续的块(这非常重要,正如您将看到的那样)。
int countDigits(char *input) {
int digitCount = 0;
for (int i = 0; i < strlen(input); i++) // for every character
if (input[i] >= '0' && input[i] <= '9') // if it is a digit
digitCount++;
return digitCount;
}
我用这种方式编写了这个函数来介绍一些角色操作技巧。如果条件是:
会更好if (isdigit(input[i]))
出于携带原因。请注意,函数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;
}
现在您只需要使用此功能并检查它是否为您输入的输入返回2.
答案 2 :(得分:0)
没有理由使用小型缓冲区。使用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();