从C转C#:使用Console.Read()无法连续输入两个整数的技术咨询
Console.Read() vs C语言scanf:为什么你的C#代码跳过了第二个输入?
嘿,刚从C转C#的时候我也被这个问题坑过!咱们一步步拆解你的问题,搞清楚这俩函数的差异到底在哪。
先看你遇到的现象:输入1后直接输出49 + 13 = 62
你输入的1是字符,Console.Read()返回的是这个字符的Unicode编码值(对于ASCII字符来说就是ASCII码),所以'1'对应的编码是49。而你按下回车键后,Windows系统会往输入缓冲区里写入两个字符:回车符\r(ASCII 13)和换行符\n(ASCII 10)。
你的代码执行流程是这样的:
- 第一次
Console.Read()读取了缓冲区里的第一个字符'1',返回49给input1。 - 第二次
Console.Read()直接读取了缓冲区里剩下的\r(回车符),返回13给input2——根本不需要你再输入,因为缓冲区里还有字符! - 最后自然就输出了
49 + 13 = 62。
为什么C语言的scanf不会有这个问题?
C语言里的scanf("%d", &num)是格式化输入函数,它的行为和Console.Read()完全不一样:
- 它会自动跳过输入流里的空白字符(空格、回车、制表符这些),直到找到数字字符。
- 然后它会读取连续的数字字符,把它们转换成整数赋值给变量。
- 读取完成后,它会把输入流里剩下的空白字符(比如你按的回车)留在缓冲区,但如果下一次还是用
scanf("%d"),它会继续跳过这些空白,等待你输入下一个数字——所以你不会遇到跳过输入的问题。
而Console.Read()是底层的单个字符读取函数,它不会做任何格式化解析,也不会跳过空白,只要缓冲区里有字符,它就直接读取,不管那是数字还是回车换行。
怎么解决你的C#代码问题?
如果你想读取整数,推荐用更合适的方法:
- 用Console.ReadLine()读取整行,再转成整数:
Console.Write("First number: "); int input1 = int.Parse(Console.ReadLine()); Console.Write("Second number: "); int input2 = int.Parse(Console.ReadLine()); Console.Write("{0} + {1} = {2}", input1, input2, input1 + input2);
Console.ReadLine()会读取你输入的一整行(直到按下回车),然后返回字符串,你再用int.Parse()把它转换成整数。如果担心输入不是有效数字,可以用int.TryParse()做安全处理。
- 如果非要用Console.Read(),需要手动清空缓冲区:
比如读取完第一个字符后,把回车和换行都读掉:
Console.Write("First number: "); int input1 = Console.Read() - '0'; // 把ASCII码转成数字 // 清空缓冲区里的回车和换行 while (Console.Read() != '\n'); Console.Write("Second number: "); int input2 = Console.Read() - '0'; while (Console.Read() != '\n'); Console.Write("{0} + {1} = {2}", input1, input2, input1 + input2);
但这种方法很麻烦,而且只适合单个数字的情况,不推荐用来读取多位数的整数。
总结两者核心差异
scanf("%d")是格式化解析函数:专注于把输入转换成指定类型(比如整数),自动处理空白字符。Console.Read()是字符读取函数:只读取单个字符的编码,不做任何解析,也不跳过空白,完全是底层的输入流操作。
内容的提问来源于stack exchange,提问作者Ismael Melero Olea
相关产品推荐
相关产品推荐

