为什么C#中int似乎默认为50而不是0?

为什么C#中int似乎默认为50而不是0?,c#,C#,我的目标是询问用户,他们希望打印三张预先确定的ascii艺术图片中的哪一张,以及他们希望打印多少次。我的问题是它的打印量是所选数字的50倍。我尝试转换print变量,但没有成功。我对C#相当陌生,所以我为任何重大的、基本的错误道歉 Console.WriteLine("Would you like to print picture 1, 2, or 3?"); int print = 0; string choice = ""; while

我的目标是询问用户,他们希望打印三张预先确定的ascii艺术图片中的哪一张,以及他们希望打印多少次。我的问题是它的打印量是所选数字的50倍。我尝试转换print变量,但没有成功。我对C#相当陌生,所以我为任何重大的、基本的错误道歉

 Console.WriteLine("Would you like to print picture 1, 2, or 3?");

        int print = 0;
        string choice = "";


        while (choice != "end")
        {
            choice = Console.ReadLine();

            switch (choice)
            {
                case "1":
                    Console.WriteLine("How many times would you like to print it");
                    print = Convert.ToInt32(Console.ReadLine());
                    while (print > 10)
                    {
                        Console.WriteLine(cocaCola);
                        print -= 1;
                    }
                    break;
                case "2":
                    Console.WriteLine("How many times would you like to print it");
                    print = Convert.ToInt32(Console.ReadLine());
                    while (print > 10)
                    {
                        Console.WriteLine(beam);
                        print -= 1;
                    }
                    break;
                case "3":
                    Console.WriteLine("How many times would you like to print it");
                    print = Convert.ToInt32(Console.ReadLine());
                    while (print > 10)
                    {
                        Console.WriteLine(liberty);
                        print -= 1;
                    }
                    break;
                default:
                    Console.WriteLine("You chose nothing");

                    break;
            }
            Console.WriteLine("Choose again, or type \"end\" to exit");

它不会再打印50次;它又打印了48次

您正在读取一个字符并将其unicode值赋给一个整数。例如,用户键入“1”,字符
1
。它的Unicode值是49。将49分配给int
print
,就在这里了。字符实际上是一个小整数,本质上是某个字符表的索引

在Unicode中,正如在ASCII中一样,“0”是十进制48,“1”是十进制49,依此类推,直到“9”。这就是48的来源

你想做的事情更像这样。首先,你要阅读整行文字,而不仅仅是第一个字符;如果用户键入“12”怎么办?然后需要解析字符串“1”(或“12”,即两个字符)以获得整数“1”或“12”

事实上,这正是你在这条线上所做的:

print = Convert.ToInt32(Console.ReadLine());
因此,在您拥有的每个地方使用该版本
print=Console.Read()

第二个错误:您将print设置为一些可能很小的数字,比如用户键入“4”,那么它就是
4
。然后当它大于10时循环-,但它永远不会大于10。要在大于零时循环:

while (print > 0)
{
    Console.WriteLine(cocaCola);
    print -= 1;
}
你需要在三个地方解决这个问题

使现代化 三个地方比你想处理的要多。还有一件事:只需在switch语句中设置一个变量,并只编写一次循环,就可以大大简化代码(可以用其他方式进一步简化,但让我们一步一步):


检查
Console.Read()
的文档。它不起作用,并且返回您所期望的。请阅读并接受以下提示:奇怪的是,OP在切换之前确实有这些提示。@juharr是的。但是当你第一次学习的时候,很容易被搞混。你写的东西有一半是猜测。对我来说,他被打是个谜。当我按照你的建议做的时候,它停止打印ascii码。它只是不停地问问题而不打印出来out@DevinRogers哎呀,我的错--打印>0时需要循环,而不是打印>时10@EdPlunkett就这样。谢谢你的帮助,我会确保学到更多关于调试的知识
Console.WriteLine("Would you like to print picture 1, 2, or 3?");

int print = 0;
string choice = "";


while (choice != "end")
{
    choice = Console.ReadLine().Trim();
    String thingToPrint = null;

    switch (choice)
    {
        case "1":
            thingToPrint = cocaCola;
            break;

        case "2":
            thingToPrint = beam;
            break;

        case "3":
            thingToPrint = liberty;
            break;
    }

    if (thingToPrint != null)
    {
        Console.WriteLine("How many times would you like to print it");
        print = Convert.ToInt32(Console.ReadLine());
        while (print > 0)
        {
            Console.WriteLine(thingToPrint);
            print -= 1;
        }
    }
    else
    {
        Console.WriteLine("You chose poorly. Try again.");
    }

    Console.WriteLine("Choose again, or type \"end\" to exit");
}