Как мне ограничить пользователя вводом любой 4-значной комбинации, включая комбинации, начинающиеся с 0, и исключая все остальные символы в C?

#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 Прошу прощения; Я был слишком неосторожен. Сейчас я это исправил.