Как проверить правильность ввода двоичного числа, содержащего цифры, отличные от 0 и 1 в c? - PullRequest
1 голос
/ 16 июня 2020

Я написал функцию, которая предлагает пользователю ввести двоичную числовую последовательность из 0 и 1 и выводит следующее.

A) Десятичное представление двоичного числа

B) Шестнадцатеричное представление двоичного числа (основание 16)

Если ввод недопустим (то есть, если bin_num содержит цифры, отличные от 0 и 1), пользователь должен получить сообщение об ошибке (подробно описано ниже).

Пример запуска программы:

Please enter binary number input: 112011

invalid input, please try again.

Please enter binary number input: 110011

110011 to decimal is: 51

110011 to hexadecimal is: 0x33

Чтобы правильно решить проблему, я не смогу читать двоичные числа как целые, так как это может вызвать переполнение. С другой стороны, ответ (в десятичном формате) всегда будет соответствовать стандартному целочисленному размеру.

Мой вопрос: как проверить правильность, если двоичное число (вводимое пользователем) содержит цифры, отличные от 0 и 1?

Я что-то пробовал, но ничего не вышло.

Это мой код:

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define ENTERING_QUESTION "Please choose a question by entering 1-5 (enter 0 to exit):" 


#define MAX_SIZE_INPUT 31
#define QUESTION1_INPUT_MESSAGE "Please enter binary number input:"
#define QUESTION1_OUTPUT_MESSAGE_DECIMAL "to decimal is:"
#define QUESTION1_OUTPUT_MESSAGE_HEXADECIMAL "to hexadecimal is:"
#define QUESTION1_ERROR_MESSAGE "invalid input, please try again."
void bin2hexanddec(char *bin_str)
{       
        for (int i = 0; i < MAX_SIZE_INPUT; i++) {
        if (bin_str[i] != '0' && bin_str[i] != '1') {
            printf(QUESTION1_ERROR_MESSAGE"\n");
            return;
        }
    }
    char *ptr;
    long long input_num= strtol(bin_str, &ptr, 10);
    int dec = 0, i = 0, rem;
    
    while (input_num != 0) {
        rem = input_num % 10;
        input_num /= 10;
        dec += rem * pow(2, i);
        ++i;
    }
    printf("%lld " QUESTION1_OUTPUT_MESSAGE_DECIMAL " %d\n", input_num, dec);
    printf("%lld " QUESTION1_OUTPUT_MESSAGE_DECIMAL " %X\n", input_num, dec);

    return;

}

.
.
.
int main()
{

    char bin_str[MAX_SIZE_INPUT
    .
    .
    .
    printf(ENTERING_QUESTION"\n");
    scanf("%d", &choice);
        if (choice == 1) {
            printf(QUESTION1_INPUT_MESSAGE"\n");
            scanf("%s", bin_str);
            bin2hexanddec(bin_str);
        }
    .
    .
    .


    return 0;
}

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

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

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[100];
    if(fgets(str, sizeof str, stdin) == NULL) {
        // handle error
        return 1;
    }
    str[ strcspn(str, "\n") ] = 0;   // remove trailing newline

    if (strspn(str, "01") == strlen(str)) {
        puts("Binary digits");
    }
    else {
        puts("Not binary");
    }
    return 0;
}
1 голос
/ 16 июня 2020

Вы проверяете слишком много символов:

for (int i = 0; i < MAX_SIZE_INPUT; i++) {

Если входная строка меньше MAX_SIZE_INPUT, вы читаете за конец записанной строки. Вместо этого вы хотите:

for (int i = 0; i < strlen(bin_str); i++) {

Кроме того, чтобы преобразовать число, вместо того, чтобы читать его как базу 10 и выполнять перевод, просто скажите strtol использовать базу 2. Вы также можете проверить, ptr указывает на нулевой байт в конце строки для проверки недопустимых символов.

void bin2hexanddec(char *bin_str)
{  
    char *ptr;
    int input_num= strtol(bin_str, &ptr, 2);
    if (!*ptr) {
        printf(QUESTION1_ERROR_MESSAGE"\n");
        return;
    }

    printf("%s " QUESTION1_OUTPUT_MESSAGE_DECIMAL " %d\n", bin_str, input_num);
    printf("%s " QUESTION1_OUTPUT_MESSAGE_DECIMAL " %X\n", bin_str, input_num);
}
...