【问题标题】:Getting c# input from console but does not return correct output [duplicate]从控制台获取c#输入但不返回正确的输出[重复]
【发布时间】:2016-04-11 19:42:13
【问题描述】:

C# 程序试图从用户那里获取输入并使用这两个数字来查找产品。

using System;

namespace Program
{
    class MainClass
    {
        static int computeProd1(int num1, int num2)
        {
            return (num1 * num2);
        }

        public static void Main (string[] args)
        {
            int first, second;

            Console.Write ("enter first number: ");
            first = Convert.ToInt32 (Console.ReadLine ());
            Console.Write ("enter 2nd number: ");
            second = Convert.ToInt32 (Console.ReadLine ());

            int product = computeProd1 (first, second);
            //Console.WriteLine ("\n First number is: {0}" , first);
            //Console.WriteLine ("\n Second number is: {0}" , second);
            Console.WriteLine ("\nTheir product is: {0}" , product);
            Console.ReadKey ();     
        }
    }
}

无论我输入什么,第一个和第二个数字都已经输出了一个数字。

【问题讨论】:

  • 那是什么问题,你不想接受非数字输入吗?
  • 只接受数字输入
  • 如果我输入 0,它将打印 48,任何大于 0 的数字都将添加 48
  • int.TryParse() 是你想要的。
  • 问题是你使用的是 Read() 而不是 ReadLine()

标签: c# input


【解决方案1】:

console.Read 返回输入的字符的 ascii 码而不是 int 值

试试这个代码,它会要求输入数字(只有数字),然后返回产品:

class Program
{
    static int computeProd1(int num1, int num2)
    {
        return (num1 * num2);

    }

    public static void Main(string[] args)
    {

        int? first = null, second = null;
        int first_i = 0, second_i = 0;

        while (!first.HasValue)
        {
            Console.WriteLine("enter first number");

            if (int.TryParse(Console.ReadLine(), out first_i))
            {
                first = first_i;
            }
        }

        while (!second.HasValue)
        {
            Console.WriteLine("enter second number");

            if (int.TryParse(Console.ReadLine(), out second_i))
            {
                second = first_i;
            }
        }

        int product = computeProd1(first_i, second_i);
        Console.WriteLine("Their product is:\t" + product);
        Console.Read();
    }
}

【讨论】:

    【解决方案2】:

    也许试试这个代码。

    更新

    使用 int.tryParse() 的更多失败证明方法。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static int computeProd1(int num1, int num2)
            {
                return (num1 * num2);
    
            }
    
            public static void Main(string[] args)
    
            {
                try
                {
                    int first, second, product = 0;
    
                    if (int.TryParse(Console.ReadLine(), out first))
                    {
                        if (int.TryParse(Console.ReadLine(), out second))
                        {
                            product = computeProd1(first, second);
                        }
                        else
                        {
                            Restart();
                        }
                    }
                    else
                    {
                        Restart();
                    }
    
    
                    Console.WriteLine("Their product is:\t" + product);
    
                    Console.ReadLine();// So it wont close.
                }
                catch(Exception ex)
                {
                    throw ex;
                }
            }
    
            public static void Restart()
            {
                Console.WriteLine("Oops something went wrong thats not a number!");
                Console.WriteLine("Restarting in 3 seconds...");
                System.Threading.Thread.Sleep(3000);
                var fileName =   System.Reflection.Assembly.GetExecutingAssembly().Location;
                System.Diagnostics.Process.Start(fileName);
                Environment.Exit(0);
            }
        }
    }
    

    【讨论】:

    • 它给了我一个异常错误
    • 输入字符串格式不正确
    • 更新了我的答案,但我会推荐 s-s 给出的示例。有很多方法可以使罗马比其他方法更好。
    【解决方案3】:

    默认Console.Read()根据当前character encoding返回输入字符的值。例如,这里是windows-1250 的链接,它可能解释了为什么 0 得到 48 等。

    如果您只想使用单个数字,您可以使用Convert.ToChar() 获取实际的键值。对于多位数值,您可以使用int.TryParse() 方法。以下是两者的示例:

    int first, second;
    //for single digit inputs
    var singleDigitInput1 = Convert.ToChar(Console.Read).ToString();
    var singleDigitInput2 = Convert.ToChar(Console.Read).ToString();
    
    //for multi digit inputs
    var multiDigitInput1 = Console.ReadLine();
    var multiDigitInput2 = Console.ReadLine()
    
    if (int.TryParse(singleDigitInput1, out first) && int.TryParse(singleDigitInput2, out second))
    {
        int product = computeProd1(first, second);
        Console.WriteLine("Their product is:\t" + product);
    }
    else
    {
        //input cannot be converted to int
    }
    

    【讨论】:

    • 嗯,可能不是 ASCII,但想法是一样的。见Input.Encoding
    • @TomBlodget 感谢您指出,我将删除该引用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多