#c #validation #input #integer #scanf
#c #проверка #ввод #целое число #scanf
Вопрос:
Я пишу программу на C, в которой я хочу, чтобы пользователь мог изменять свой существующий PIN-код, единственное требование, позволяющее изменять pin-код, заключается в том, что пользователь должен ввести новый PIN-код, который должен быть 4-значным числом любой комбинации, включая те, которые начинаются с 0 (например: 0000
, 0297
, 0005
, 0050
…) и PIN-код не должен содержать никаких алфавитных символов
затем они должны повторно ввести свой новый PIN-код, чтобы подтвердить его, если повторно введенный pin-код совпадает с первым вновь введенным PIN-кодом, тогда пользователям будет назначен новый PIN-код.
if (temppin1 == temppin2)
Я инициализировал временные контакты как an int
, для сравнения аргументов, подобных приведенным выше.
вот фрагмент моего кода
case '2':
//program asks user to enter their new PIN.
printf("Enter your new PIN:n");
scanf("d", amp;temp_pin1);
//program asks user to re-enter their new PIN.
printf("Please re-enter to confirm your new PIN:n");
scanf("d", amp;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 amp;amp; (isalpha(temp_pin1) == 0) amp;amp; (temp_pin1 >= 1000 amp;amp; 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) amp;amp; ((temp_pin1 > 1000) amp;amp; (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
). последняя часть, которую мне просто нужно выяснить, — это как разрешить пользователю 4числовое число, которое может начинаться с 0 (например: 0000
, 0297
, 0005
, 0050
…) и сохранять его с начальным 0
значением, я знаю, что C будет принимать введенные числа int, начинающиеся с 0
нулевого значения, поэтому, но мне также нужно сравнить две переменные и посмотреть, совпадают ли они, возможно, требуется другой тип данныхиспользовать… но я не уверен.
Любая помощь или понимание того, что я могу сделать, чтобы решить эту сложную проблему проверки, были бы очень признательны.
Комментарии:
1. Вы не можете использовать
scanf
для этого. Используйтеfgets
, а затем проанализируйте строку самостоятельно, возможно, используяsccanf
.2. Вы сохраняете PIN-код пользователя в переменной actual_pin, которая является целым числом. Таким образом, очевидно, что начальный ноль не имеет значения. Итак, если значение actual_pin равно 5, это означает ввод пользователем 0005 (неявный). В случае, если вам нужно отобразить actual_pin позже в вашей программе, вы добавляете начальный ноль, используя тот же форматировщик (d) в printf..
Ответ №1:
scanf
это можно сделать, используя %n
для учета количества обработанных символов. Это приведет к отклонению ввода 12
, 005
или 12345
. %d
будут приниматься только цифры, поэтому abc
будут отклонены. Нет необходимости isalpha
.
Очистите ввод с getchar
помощью . Если во входном потоке есть какие-либо символы, отличные от новой строки. ввод отклоняется, чтобы предотвратить ввод 1234abc
.
fgets
также может использоваться для чтения строки. strspn
будет подсчитываться количество последовательных совпадающих символов. За соответствующими цифрами должен следовать символ новой строки, иначе ввод будет отклонен.
Обычно НЕ СМЕШИВАЙТЕ FGETS и SCANF. Это использует оба и будет работать только потому, что after 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", amp;start, amp;temp_pin1, amp;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", amp;temp_pin2);
} while ( temp_pin1 != temp_pin2);
printf ( "new PIN: dn", temp_pin1);
return 0;
}
Комментарии:
1. Я запустил этот код, и он работает безупречно и делает все, что я хочу, чтобы он делал, вы легенда за пределами нашего времени, я собираюсь попробовать использовать логику и внедрить ее в свою программу, спасибо!!
Ответ №2:
Тестирование isalpha(temp_pin1)
не имеет смысла: вы проверяете, является ли PIN-код ASCII кодом для буквы, что не имеет значения: 0065
является допустимым PIN-кодом, но также является ASCII-кодом для 'A'
.
Вы должны просто прочитать PIN-код как int
и убедиться, что он находится в диапазоне 0
от 9999
включительно:
case '2':
//program asks user to enter their new PIN.
printf("Enter your new PIN:n");
if (scanf("%d", amp;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", amp;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;
Ответ №3:
Ваша программа полностью функциональна; нет необходимости в каких-либо изменениях. 0008 совпадает с 8, поскольку оно хранится внутри как целое число. Во время сравнения не возникнет никаких проблем. При необходимости вы можете изменить int на char[4] (или char[5] для завершающего нулевого байта, если вы хотите обработать его как строку), если это необходимо. Прочитайте PIN-код, используя
char temp_pin1[5];
scanf("%4s", temp_pin1);
или
char temp_pin1[4];
scanf("%c%c%c%c", amp;temp_pin1[0], amp;temp_pin1[1], amp;temp_pin1[2], amp;temp_pin1[3]);
А затем проверьте, являются ли символы числами.
Комментарии:
1. @chqrlie Прошу прощения; Я был слишком неосторожен. Сейчас я это исправил.