我正在用 C 编写一个程序,我希望用户能够更改他们现有的 PIN,允许 pin 能够更改的唯一要求是用户必须输入一个新的 PIN,该 PIN 必须是任意组合的 4 位数字,包括以 0 开头的数字(例如:0000
,0297
,0005
,0050
...并且 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
开头,2
、3
、4
、5
、6
、7
、8
、9
)。 我只需要弄清楚的最后一部分是如何让用户以 0 开头的 4 位数字(例如:0000
,0297
,0005
,0050
...并将其与初始0
一起存储,我知道 C 会将以0
开头的输入的整数作为空值,所以我还需要比较两个变量,看看它们是否相同,也许需要使用不同的数据类型...但我不确定。
任何帮助,或对我能做些什么来解决这个棘手的验证问题的见解将不胜感激。
可以使用%n
来捕获处理的字符数来完成scanf
。这将拒绝12
、005
或12345
的输入。%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
读取,并验证它是否在0
9999
(含)的范围内:
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]);
然后检查字符是否为数字。