温度单位转换程序输入非法单位时重复输出错误信息求助
温度单位转换程序问题:输入无效单位时重复输出错误信息
问题根源
问题出在scanf("%c", &unit);的输入处理逻辑上:当你输入无效单位后按下回车,输入缓冲区会残留无效字符+换行符。第一次循环读取到无效字符,触发错误提示并跳回start;但第二次循环时,scanf("%c")会直接读取缓冲区里的换行符(这个字符既不是C也不是F),因此再次触发错误分支,导致输出两条错误信息。
解决方案
方案1:修改scanf格式串跳过空白字符
在读取单位的scanf格式串中,给%c前加一个空格,让scanf自动跳过所有空白字符(包括换行符、空格、制表符),确保每次读取的都是用户输入的有效字符:
scanf(" %c", &unit);
方案2:清理输入缓冲区(适配复杂场景)
如果不想修改格式串,可以在错误分支里清空输入缓冲区的残留字符,避免影响下一次读取:
else { printf("\nYou have entered an invalid unit. Please try again.\n"); // 清空缓冲区直到遇到换行符 while (getchar() != '\n'); goto start; }
额外优化建议
- 替换
goto语句(结构化编程推荐)
用do-while循环替代goto,代码可读性更好:
int main() { printf("Temperature Unit Converter\n\n"); char unit; double temp; int is_valid = 0; do { printf("Enter unit of measurement (C or F): "); scanf(" %c", &unit); unit = toupper(unit); if (unit == 'C') { printf("\nEnter temperature in %c: ", unit); scanf("%lf", &temp); temp = (temp * 9.0/5.0) + 32; printf("\nThe temperature = %.1lf degrees Fahrenheit\n", temp); is_valid = 1; } else if (unit == 'F') { printf("\nEnter temperature in %c: ", unit); scanf("%lf", &temp); temp = (temp - 32) * 5.0/9.0; printf("\nThe temperature = %.1lf degrees Celsius\n", temp); is_valid = 1; } else { printf("\nYou have entered an invalid unit. Please try again.\n"); } } while (!is_valid); return 0; }
- 修正整数除法问题
把代码中的9/5、5/9改成9.0/5.0、5.0/9.0,避免整数除法导致的精度丢失(C语言中整数相除会直接舍弃小数部分)。
内容的提问来源于stack exchange,提问作者Elias Xambali
相关产品推荐
相关产品推荐

