为什么输入后会立即显示输出

时间:2018-05-31 22:03:45

标签: c#

我目前正在使用C#试验Stacks。我已经创建了这个小测试程序来推送,弹出和查看堆栈:

 Stack st = new Stack();

        Console.WriteLine("Add item to Stack");
        int inp = Convert.ToInt32(Console.ReadLine());
        st.Push(inp);

        ty:
        Console.WriteLine("");
        Console.WriteLine("A to Add");
        Console.WriteLine("D to Pop");
        Console.WriteLine("V to View");
        char act = Console.ReadKey().KeyChar;

        switch (act)
        {
            case 'A':
                Add(st);
                break;
            case 'D':
                Remove(st);
                break;
            case 'V':
                View(st);
                break;

            default:
                Console.WriteLine("Not an valid option");
                break;
        }

        goto ty;

然而,当我尝试为决策部分输入一个角色时,这会立即导致它在同一行上重复:

Screenshot

问题是,为什么会发生这种情况;我是否正确使用Console.WriteLine?

2 个答案:

答案 0 :(得分:2)

您当前问题的答案是在Console.ReadKey()之后您没有打印空行。因此,无论程序写入下一个控制台的程序都在同一行。

话虽如此,这段代码有很多不好的做法。

首先,我摆脱了goto。使用goto时的一个好的经验法则是“#34;永远"”。说真的,我怀疑会有一种情况,你别无选择,只能使用goto,如果你发现自己处于这样的境地,那么你可能做错了。说实话,你可以在某些情况下证明使用它,但至少在这种情况下它并不是真的有必要。请read more here

其次,你没有办法退出你的循环而不是强迫你的程序关闭Ctrl+C,这不是一个好的终止方式。就个人而言,我重构你的代码,所以输入/显示/操作被分成他们自己的方法,如下所示:

static void Main(string[] args)
{
    Stack st = new Stack();
    Add(st);
    StackOperation(st);
}

static void StackOperation(Stack st)
{
    string act = string.Empty;
    while (act != "Q")
    {
        act = DisplayPrompt();
        switch (act)
        {
            case "A":
                Add(st);
                break;
            case "D":
                Remove(st);
                break;
            case "V":
                View(st);
                break;
            case "Q":
                break;
            default:
                Console.WriteLine("Not a valid option");
                break;
        }
    }
}

static string DisplayPrompt()
{
    Console.WriteLine();
    Console.WriteLine("A to Add");
    Console.WriteLine("D to Pop");
    Console.WriteLine("V to View");
    Console.WriteLine("Q to Quit");
    var act = Console.ReadKey().KeyChar;
    Console.WriteLine();
    return act.ToString();
}

static void Add(Stack st)
{
    Console.Write("Input item to add to stack: ");
    int inp = Convert.ToInt32(Console.ReadLine());
    st.Push(inp);
}

static void Remove(Stack st) { Console.WriteLine("Delete item from Stack"); }
static void View(Stack st) { Console.WriteLine("View Stack"); }

显然,这只是如何重构的一个非常粗略的想法,你应该把它作为指导而不是成品。

答案 1 :(得分:0)

您可以将读取操作更改为:

Console.ReadKey(True)