首页 > 解决方案 > 如何检查输入的二进制数是否包含c中不同于0和1的数字?

问题描述

我写了一个函数,提示用户输入0-s和1-s的二进制数序列,输出如下。

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;
}

标签: cbinarybitwise-operators

解决方案


您可以使用库函数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;
}

推荐阅读