C# Visual Studio 2022两数求和程序输入跳过、结果异常问题
问题描述
在Visual Studio 2022环境下使用C#编写两数求和练习代码,代码如下:
class Program { static void Main(string[] args) { int x, y, sum; Console.Write("Enter the value of X: "); x = Console.Read(); Console.Write("Enter the value of Y: "); y = Console.Read(); Console.WriteLine(); sum = x + y; Console.WriteLine("SUM = " + sum); Console.WriteLine(); Console.WriteLine("Press any key to close..."); Console.ReadKey(); } }
运行时出现异常:输入X的值按下回车键后,程序直接跳过Y值输入环节执行求和计算,输出不符合预期的结果66,未按设计等待用户输入Y值后再计算两数之和。
错误原因
问题核心是对Console.Read()方法的行为理解错误:
Console.Read()每次只会从输入缓冲区读取单个字符的编码值,返回的int值是对应字符的ASCII/Unicode编码,不会自动将用户输入的数字字符串转换为对应的整数数值。- 控制台输入按回车后,输入的内容、加上Windows系统回车产生的两个控制字符
\r(ASCII码13,回车符)、\n(ASCII码10,换行符)会全部送入输入缓冲区。第一次调用Console.Read()时仅读取缓冲区第一个字符(也就是你输入X时敲的第一个字符),剩余内容(包括回车控制符)全部留在缓冲区中。 - 第二次调用
Console.Read()时,程序不会等待用户新输入,会直接读取缓冲区中剩余的第一个字符(也就是回车符\r)。你得到的结果66刚好是字符'5'的ASCII码53加上回车符\r的ASCII码13的和,和错误表现完全吻合。
修复方案
需要替换输入方法,使用Console.ReadLine()读取用户输入的整行内容,再将字符串转换为整数类型,修复后代码如下:
class Program { static void Main(string[] args) { int x, y, sum; Console.Write("Enter the value of X: "); // 读取整行输入,转换为整数,该方法会自动消耗掉回车产生的控制符,不会残留输入 x = int.Parse(Console.ReadLine()); Console.Write("Enter the value of Y: "); y = int.Parse(Console.ReadLine()); Console.WriteLine(); sum = x + y; Console.WriteLine("SUM = " + sum); Console.WriteLine(); Console.WriteLine("Press any key to close..."); Console.ReadKey(); } }
注:练习场景下上述代码可以正常运行,如果需要做输入合法性校验(比如用户输入非数字内容的场景),可以后续替换为int.TryParse()方法做容错处理。
内容的提问来源于stack exchange,提问作者Marcb7
相关产品推荐
相关产品推荐

