Проверка, делится ли каждая цифра на 2 - PullRequest
2 голосов
/ 05 марта 2019

Я пишу программу на C, чтобы попросить пользователя ввести пин-код и проверяет, делится ли каждая цифра числа на 2. Например, если они вводят 123452, он сообщает пользователю, что это неправильно, потому что 1, 2,3,5 не делится на 2. Если я ввожу 642642, он говорит, что все в порядке, но если я ввожу в 622248, он отображает недопустимое число, что неверно, потому что каждая цифра в 622248 делится на 2. Как я могу это исправить ошибка?

#include <stdio.h>
#define N 6 

int main(void)
{
    int num, digits[N], i, invalid, count = 1, sum = 0;

    TOP:
    printf("Enter pin code (attempt %d): ", count++);
    scanf("%d", &num);

    invalid = num;
    // stores each digit of the number entered into the the array
    for (i = 6; i >= 0; i--) {
        digits[i] = num % 10;
        num = num / 10; 
    }
    // if the user enters more than 6 digits than it will give you an error.
    if (digits[N] > 6) {
       printf("Code %d is invalid!\n", invalid); 
       goto TOP;
    } 
    // loops through the array elements and see if each digit is divisble by 2, if not then print an error.
    for (i = 0; i < 6; i++) {
        if (digits[i] % 2 != 0) {
            printf("Code %d is invalid!\n", invalid); 
            goto TOP;
        }
        else {
            printf("Congratulation, code %d is valid!\n", invalid);
            break;
        }
    }

    return 0;
}

Ответы [ 2 ]

4 голосов
/ 06 марта 2019

Если вам разрешено обрабатывать ввод как строку, а не как целое число, все, что нужно, это strspn для определения достоверности цифр на выводе и strlen для определения правильности длины:

#include <string.h>

size_t len = strlen(str_pin);
if (len <= 6 && strspn(str_pin, "24680") == len)
{
    puts("Valid pin");
}
else
{
    puts("Invalid pin");
}
2 голосов
/ 05 марта 2019

Существует проблема с тем, как вы храните цифры:

for (i = 6; i >= 0; i--) {
    digits[i] = num % 10;
    num = num / 10; 
}

Длина массива digits равна 6, что означает, что допустимые индексы идут от 0 до 5, но вы начинаете читать вindex 6. Это записывает за пределы массива, вызывая неопределенное поведение .

Измените цикл так, чтобы он начинался с 5.

for (i = 5; i >= 0; i--) {
    digits[i] = num % 10;
    num = num / 10; 
}

Эта проверка также недействительна:

if (digits[N] > 6) {

Потому что он снова читает за концом массива.Даже если он не прочитал до конца, вы проверяете, больше ли элемент массива больше 6, а не если есть более 6 цифр.

Вы делите num на 10 в циклечтобы получить цифры, поэтому, если это значение не равно нулю, вы знаете, что слишком много цифр.

if (num > 0) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...