c语言不同进制scanf
时间: 2024-10-24 22:14:33 浏览: 24
在C语言中,`scanf()`函数通常用于从标准输入读取数据,并按照指定的格式进行解析。当你需要处理不同进制的数据时,`scanf()`默认的是基于十进制的。然而,C标准库并没有直接支持二进制、八进制或十六进制的`scanf`格式说明符。
如果你想要读取二进制数,可以先将输入转换成字符串,然后手动解析每一位的二进制表示。例如:
```c
#include <stdio.h>
#include <stdlib.h>
int binary_to_int(const char *binary_str) {
int num = 0;
for (int i = 0; binary_str[i]; i++) {
if (binary_str[i] == '1') {
num *= 2;
num += 1;
}
}
return num;
}
int main() {
char binary[64];
printf("Enter a binary number: ");
scanf("%s", binary);
int decimal = binary_to_int(binary);
printf("Decimal value: %d\n", decimal);
return 0;
}
```
对于八进制或十六进制,你可以分别通过去除前缀'0o'和'0x'来进行类似的操作,但手动解析会更复杂一些。如果要保持更高的兼容性和简洁性,可以考虑使用第三方库如`strtol`函数配合转义字符来处理这种格式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
long long strtol_radix(char* str, char** endptr, int base) {
// ... 实现基于base的strtol函数 ...
}
int main() {
char input[32];
printf("Enter an octal number (prefix with '0o'): ");
fgets(input, sizeof(input), stdin);
size_t len = strlen(input);
if (input[0] == '0' && input[1] == 'o' && len > 2 && input[len - 1] != '\n') {
long long decimal = strtol_radix(input + 2, NULL, 8);
printf("Decimal value: %lld\n", decimal);
} else {
printf("Invalid input.\n");
}
return 0;
}
```
在这个例子中,`strtol_radix`是一个简化版本的`strtol`函数,它可以根据给定的基数进行解析。
阅读全文