如何限制用户输入任何 4 位数字组合,包括以 0 开头的组合并排除 C 中的所有其他字符?



我正在用 C 编写一个程序,我希望用户能够更改他们现有的 PIN,允许 pin 能够更改的唯一要求是用户必须输入一个新的 PIN,该 PIN 必须是任意组合的 4 位数字,包括以 0 开头的数字(例如:0000029700050050...并且 PIN 不得包含任何字母字符

然后,他们必须重新输入新的 PIN 码进行确认 如果重新输入的 PIN 与第一个新输入的 PIN 匹配,则将为用户分配新的 PIN。

if (temppin1 == temppin2)

我已经将临时引脚初始化为int,用于上述比较参数。

这是我的代码片段

case '2':
//program asks user to enter their new PIN.
printf("Enter your new PIN:n");
scanf("%04d", &temp_pin1);
//program asks user to re-enter their new PIN.
printf("Please re-enter to confirm your new PIN:n");
scanf("%04d", &temp_pin2);
//if the re-entered pin matches the temp_pin1 then then the program will assign the new PIN to the users actual_pin.
if (temp_pin1 == temp_pin2 && (isalpha(temp_pin1) == 0) && (temp_pin1 >= 1000 && temp_pin1 < 9999)) {
printf("nn New PIN has been confirmednn");
actual_pin = temp_pin1;
}
//if the user input as letter, some other character or a number outside of the four digit including number starting with 0 range the program will give an appropriate error message.
else if ((temp_pin1 != temp_pin2) && ((temp_pin1 > 1000) && (temp_pin1 < 9999))) {
printf("error: your new PIN didn't matchn");
printf("We couldn't confirm your new PINnn");
}
//all possible 4 digit are between this range and if a number is entered outside this range the user will be given an appropriate error message.
else if ((temp_pin1 < 1000) || (temp_pin1 > 9999)) {
printf("error: Your new pin didn't meet our 4 digit PIN criteriann");
}
break;

我想出你可以使用isalpha() == 0来确保用户输入不接受字母数字,我还计算出了所有可能的 4 位数字的范围,这些数字以 (1开头,23456789)。 我只需要弄清楚的最后一部分是如何让用户以 0 开头的 4 位数字(例如:0000029700050050...并将其与初始0一起存储,我知道 C 会将以0开头的输入的整数作为空值,所以我还需要比较两个变量,看看它们是否相同,也许需要使用不同的数据类型...但我不确定。

任何帮助,或对我能做些什么来解决这个棘手的验证问题的见解将不胜感激。

可以使用%n来捕获处理的字符数来完成scanf。这将拒绝1200512345的输入。%d只接受数字,因此abc将被拒绝。无需isalpha.
getchar清洁输入。如果输入流中存在换行符以外的任何字符。输入被拒绝以防止输入1234abc

fgets也可用于读取一行。strspn将计算连续匹配的字符。匹配的数字后必须跟换行符,否则输入将被拒绝。

通常不要混合使用FGETS和SCANF。这同时使用两者,并且仅在scanf之后起作用,getchar清除待处理字符的输入流。

#include <stdio.h>
#include <string.h>
int main ( void) {
char line[100] = "";
int temp_pin1 = 0;
int temp_pin2 = 0;
int result = 0;
int start = 0;
int end = 0;
int index = 0;
int clean = 0;
do {
if ( temp_pin1 != temp_pin2) {
printf ( "PIN does not match. re-enter PINn");
}
do {
if ( clean) {
printf ( "try againn");
}
end = 0;
start = 0;
printf("Enter your new PIN:n");
fflush ( stdout);
if ( ( result = scanf ( " %n%d%n", &start, &temp_pin1, &end))) {
if ( 4 != end - start) {
result = 0;
}
}
while ( ( clean = getchar ( ))) {
if ( 'n' == clean) {
break;
}
else {
result = 0;//found trailing characters
}
if ( EOF == clean) {
fprintf ( stderr, "End Of Filen");
return 1;
}
}
} while ( 1 != result);
clean = 0;
do {
if ( clean) {
printf ( "try againn");
}
index = 0;
clean = 0;
printf("Please re-enter to confirm your new PIN:n");
fflush ( stdout);
if ( fgets ( line, sizeof line, stdin)) {
index = strspn ( line, "0123456789");
clean = 1;
}
else {
fprintf ( stderr, "End Of Filen");
return 1;
}
} while ( 4 != index || 'n' != line[index]);
sscanf ( line, "%d", &temp_pin2);
} while ( temp_pin1 != temp_pin2);
printf ( "new PIN: %04dn", temp_pin1);
return 0;
}

测试isalpha(temp_pin1)没有意义:您正在测试PIN码是否是字母的ASCII码,这无关紧要:0065是有效的PIN,但也恰好是'A'的ASCII码。

您应该将 PIN 作为int读取,并验证它是否在09999(含)的范围内:

case '2':
//program asks user to enter their new PIN.
printf("Enter your new PIN:n");
if (scanf("%d", &temp_pin1) != 1 || temp_pin1 < 0 || temp_pin1 > 9999) {
printf("invalid PIN: must be 4 digitsn");
break;
}
//program asks user to re-enter their new PIN.
printf("Please re-enter to confirm your new PIN:n");
if (scanf("%d", &temp_pin2) != 1 || temp_pin1 != temp_pin2) {
printf("error: your new PIN didn't matchn");
printf("We couldn't confirm your new PINnn");
break;
}
printf("nn New PIN has been confirmednn");
actual_pin = temp_pin1;
break;

您的程序功能齐全; 无需任何更改。 0008 与 8 相同,因为它在内部存储为整数。比较过程中不会有任何问题。如果需要,如有必要,您可以将 int 更改为 char[4](如果您想像字符串一样处理它,则可以将 char[5] 更改为终止空字节)。使用 读取引脚

char temp_pin1[5];
scanf("%4s", temp_pin1);

char temp_pin1[4];
scanf("%c%c%c%c", &temp_pin1[0], &temp_pin1[1], &temp_pin1[2], &temp_pin1[3]);

然后检查字符是否为数字。

相关内容

  • 没有找到相关文章

最新更新