C语言进制转换:如何在清空输入缓冲区前获取字符数?
2-9进制转十进制的实现方案(解决缓冲区统计问题)
核心优化思路:不用提前统计字符数也能计算
其实你不用纠结怎么提前获取字符总数,换个计算逻辑就行——迭代累加:从左到右处理每个字符,每次把当前结果乘以进制数,再加上当前字符的数值。比如处理"123"(5进制),计算过程是((0*5)+1)*5+2)*5+3 = 1*25 +2*5 +3 = 38,和你原本的1*5² +2*5¹ +3*5⁰结果完全一致,但不用算幂次,也不用提前知道总长度。
不过如果你确实需要获取字符总数,下面给两种可行方案:
方案1:整行读取输入(最稳妥)
用fgets()直接把用户输入的整行读到字符串里,既可以用strlen()直接拿到字符总数,又能逐个检查字符合法性,完全不用操心缓冲区被破坏的问题。
示例代码:
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { int base; char input[100]; // 按需调整数组大小 long long result = 0; // 输入进制 printf("输入进制(2-9): "); scanf("%d", &base); getchar(); // 吃掉scanf留下的换行符,避免fgets直接读空 // 读取数字字符串 printf("输入%d进制数字: ", base); if (fgets(input, sizeof(input), stdin) == NULL) { printf("输入错误\n"); return 1; } // 移除换行符(如果存在) size_t len = strlen(input); if (input[len-1] == '\n') { input[len-1] = '\0'; len--; } // 检查字符合法性并计算结果 for (size_t i = 0; i < len; i++) { char c = input[i]; if (!isdigit(c)) { printf("非法字符: %c\n", c); return 1; } int digit = c - '0'; if (digit >= base) { printf("数字%d超出进制%d的范围\n", digit, base); return 1; } result = result * base + digit; } printf("十进制值: %lld\n", result); return 0; }
方案2:用ungetc()统计并还原缓冲区
如果必须用getchar()处理,可以先把所有字符读入临时数组统计数量,再用ungetc()把字符按逆序放回缓冲区,这样后续还能正常读取处理。
示例代码:
#include <stdio.h> #include <ctype.h> int main() { int base; char temp[100]; int count = 0; int c; long long result = 0; printf("输入进制(2-9): "); scanf("%d", &base); getchar(); // 吃掉换行 // 第一步:统计字符数并存入临时数组 while ((c = getchar()) != '\n' && c != EOF && count < 99) { temp[count++] = c; } // 第二步:逆序放回缓冲区,保证后续读取顺序正确 for (int i = count - 1; i >= 0; i--) { ungetc(temp[i], stdin); } // 第三步:读取并计算结果 for (int i = 0; i < count; i++) { c = getchar(); if (!isdigit(c)) { printf("非法字符: %c\n", c); return 1; } int digit = c - '0'; if (digit >= base) { printf("数字%d超出进制%d的范围\n", digit, base); return 1; } result = result * base + digit; } printf("十进制值: %lld\n", result); return 0; }
注意事项
ungetc()的使用有系统限制,一般不建议放回大量字符,普通输入场景没问题;- 用
long long存储结果是为了避免大数字溢出,根据需求也可以调整为更大的类型; - 两种方案都包含了字符合法性检查,确保输入的字符是数字且不超过进制范围。
内容的提问来源于stack exchange,提问作者דולב מנג'ם
相关产品推荐
相关产品推荐

