You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

逐字符读取时始终触发默认分支: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:43:02