c - 如何检查输入的二进制数是否包含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;
}
解决方案
您可以使用库函数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;
}
推荐阅读
- java - Android 开放图谱
- javascript - 哪个更大?!我的 js 代码中的一个问题
- python - 如何根据第三个有条件地组合两列
- php - Laravel 管理员更新用户信息,更新自己的管理员帐户信息时重复的电子邮件条目
- python - 从第一个元素是索引的二维数组中获取索引
- node.js - Mongodb聚合不同的唯一和排序
- c - 为什么 for 忽略 if 语句?
- android - MQTT Paho 客户端不会自动重新连接到代理
- next.js - Next-auth Package subpath '.providers/...' 不是由“exports”定义的
- javascript - facebook 如何检测 webview 或嵌入式浏览器