逐字符读取时始终触发默认分支:C语言二十进制转十进制问题求助
问题分析与修复方案
首先咱们拆解你代码里触发默认分支的核心问题,顺便把其他潜在bug也一起修正:
1. 循环条件的类型不匹配(最关键的问题)
你写的while (x != "\n")是错误的:"\n"是字符串常量(本质是const char*类型的指针),而x是单个char变量,两者类型完全不匹配,编译器其实会警告这个比较无意义。正确写法应该是和字符常量比较:while (x != '\n')。
2. scanf读取时的空白字符问题
第一次scanf(" %c", &x);里的空格会自动跳过输入前的空白(比如换行、空格),但后面的scanf("%c", &x);没有这个空格——当你输入完一个字符按下回车时,回车的'\n'会被下一次scanf读取到,而'\n'不在你的switch case里,直接触发default分支报错。
解决方法是把后面的scanf也改成scanf(" %c", &x);,让它自动跳过空白字符,只读取有效的数字/字母字符。
3. printf输出的格式错误
最后一行printf(sum);是错误的,printf需要先传格式字符串,再传变量。正确写法是printf("%d", sum);,不然会导致未定义行为。
4. 额外的小优化:case '0'的逻辑遗漏
你当前的case '0'里只写了sum += 0;,虽然0乘任何数都是0,结果没错,但为了代码一致性,建议改成sum += 0 * exponent;。
修复后的完整代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char x; int exponent= 1; int sum = 0; int flag = 0; printf("Enter a reversed number is base 20\n"); scanf(" %c", &x); while (x != '\n') { // 修正:用字符常量'\n'而非字符串"\n" switch (x) { case '0':sum += 0 * exponent; break; // 修正:统一乘exponent case '1':sum += 1 * exponent; break; case '2': sum += 2 * exponent; break; case '3':sum += 3 * exponent; break; case '4':sum += 4 * exponent; break; case '5':sum += 5 * exponent; break; case '6':sum += 6 * exponent; break; case '7':sum += 7 * exponent; break; case '8':sum += 8 * exponent; break; case '9':sum += 9 * exponent; break; case 'A': case 'a': sum += 10 * exponent; break; case 'B': case 'b':sum += 11 * exponent; break; case 'C': case 'c' : sum += 12 * exponent; break; case 'D': case 'd': sum += 13 * exponent; break; case 'E': case 'e': sum += 14 * exponent; break; case 'F': case 'f': sum += 15 * exponent; break; case 'G': case 'g': sum += 16 * exponent; break; case 'H': case 'h': sum += 17 * exponent; break; case 'I': case 'i': sum += 18 * exponent; break; case 'J': case 'j': sum += 19 * exponent; break; default:flag++; break; } if (flag == 1) { printf("Error! %c is not a valid digit in base 20", x); break; } else { exponent *= 20; scanf(" %c", &x); // 修正:添加空格跳过空白字符 } } if (flag == 1) return 0; else printf("%d", sum); // 修正:添加格式字符串 return 0; }
简单测试一下:比如输入逆序的二十进制数A1(对应十进制的1*20 +10=30),程序会正确输出30,不会触发默认分支啦。
内容的提问来源于stack exchange,提问作者Dan Marom
相关产品推荐
相关产品推荐

