【问题标题】:Console.Read is being ignored [duplicate]Console.Read 被忽略 [重复]
【发布时间】:2012-04-25 15:31:44
【问题描述】:

我是 C# 语言的新手,刚刚开始学习它是为了在 XNA Game Studio for X-box 上使用它。

我对 Java 和 C++ 有一些小经验,所以我不是一个完全的菜鸟。这正是这个问题让我如此沮丧的原因。

我创建了一个简单的代码,旨在添加用户输入的两个数字。非常简单的东西,但对于我感觉的任何新语言来说都是很好的第一步。

我已经声明了我的变量,并试图使用 Console.Read() 从用户那里获取要添加的数字。到目前为止,代码输出了我想要的消息,然后停止并读取用户的单个输入。在那之后,它就乱了。控制台输出下一条消息,读取一些随机数(无输入),然后将它们加在一起并立即输出。

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Add
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please enter the first number to add: ");
            int firstNumber = Console.Read();

            Console.WriteLine("Please enter the second number to add: ");
            int secondNumber = Console.Read();

            int Sum = firstNumber + secondNumber;
            Console.WriteLine("The total of the two numbers is: " + Sum);

        }
    }
}

示例运行:

请输入要添加的第一个数字:

2

请输入要添加的第二个数字:

这两个数字的总和是:63


请输入要添加的第一个数字:

3

请输入要添加的第二个数字:

两个数字的总和是:64


这样继续,好像 secondNumber 是 61。

提前感谢您的帮助!

【问题讨论】:

标签: c#


【解决方案1】:

这是因为它正在从控制台读取下一个字符,然后将其转换为int,它给出的是 ASCII 值,而不是数值。因此,键入 2 将被解释为字符“2”,ascii 代码为 50。试试这个:

int firstNumber = Int32.Parse(Console.ReadLine());

【讨论】:

  • +1 用于解决问题,而不仅仅是解释。
  • 谢谢你。我不知道它返回了 ASCII 码。对于其他说使用 Console.ReadLine() 的人,我已经尝试过了,但它返回了一个错误:无法将类型 'string' 同谋转换为 'int' 我想我希望这会起作用。 XD 再次感谢您非常详细的解释!
  • @Mitchell Thomas McCann。但是Int32.Parse这个方法不适合你?
  • 只需用旧代码替换它,它就可以完美运行。谢谢!
  • 好的,很好。如果它解决了您的问题,请不要忘记接受答案。 :)
【解决方案2】:

Console.Read 读取单个字符。因此,当您输入“2”并按 Enter 时,您将提供 (1) 字符“2”,其 ASCII 值为 50,然后 (2) 回车字符,其 ASCII 值为 13。这些是... 63。:-)

【讨论】:

  • 不知道 ASCII。以为它只是返回在读取空白之前输入的内容。谢谢!
  • @MitchellThomasMcCann 因为它已经让你感到困惑,我建议快速浏览一下关于 ASCII 的 Wikipedia 文章,以及关于什么字符映射到什么 ASCII 码的文章的 reference table。 (DEC 和 Glyph 列在此处相关)
【解决方案3】:

除了 Gareth 所说的之外,也许 MSDN 信息会让你明白为什么它没有等待你在第二个 Console.Read() 方法上的输入:

Console.Read()

当您键入输入字符时,Read 方法会阻止其返回;当您按下 Enter 键时,它会终止。按 Enter 会在您的输入中附加一个依赖于平台的行终止序列(例如,Windows 会附加一个回车换行序列)。 对 Read 方法的后续调用一次检索一个字符。检索到最后一个字符后,Read 再次阻止其返回并重复循环。

所以,在您的第一个 Read() 中,它很高兴允许您输入任何您想要的内容直到您按下 Enter 键

然后,它到达第二个 Console.Read() 并说:“嘿,我已经有了第一个 Console.Read() 中的那些字符要通过。恰好第二个是空格(马车return)" 并将该空白 ASCII 值分配给 secondNumber。

【讨论】:

  • 谢谢。我读到了,但是,我认为这意味着:在第一次通话时阅读整个数字串。在第二次通话时读取单个号码。重复。即多次停止获取数据。谢谢你的澄清!
【解决方案4】:

问题在于Console.Read() 读取第一个 Return 按键并将其发送到第二个 Console.Read() 调用。你的代码应该使用ReadLine(),看起来像这样:

Console.WriteLine("Please enter the first number to add: ");
int firstNumber = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Please enter the second number to add: ");
int secondNumber = Convert.ToInt32(Console.ReadLine());

【讨论】:

    【解决方案5】:

    Console.Read 从输入块中读取单个字符。如果您输入一个数字,然后按回车键,它将读取回车键,或您输入的第一个数字的下一个数字。

    您可能希望改用 Console.ReadLine。

    【讨论】:

      【解决方案6】:

      我想你想要Console.ReadLine() 方法

      【讨论】:

        【解决方案7】:

        你应该试试 Console.ReadLine();

        【讨论】:

          【解决方案8】:

          您可能不希望 ReadLine 读取,因为 Read 需要流中的下一个字符,但 ReadLine 将等待用户按 Enter。

          如果您的用户第一次输入 34,这会导致错误,因为 firstNumber 等于 3 而不是 34。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-04
            • 1970-01-01
            • 2014-10-16
            • 2020-03-05
            • 1970-01-01
            • 1970-01-01
            • 2014-09-03
            • 1970-01-01
            相关资源
            最近更新 更多