Windows上的编译器和ideone.com之间的区别

时间:2015-03-01 17:30:04

标签: c#

我创建了两个程序,每个程序都有相同的任务。我创建一个最多10个元素的堆栈。当你写' +'这意味着接下来,您将在新行中插入一些数字到堆栈中。如果操作成功执行,程序将写入行:':)'。如果堆栈溢出,程序将写入行:':('。如果您插入' - '这意味着程序从堆栈中删除最后一个元素并在控制台中打印该元素。如果堆栈为空并且您插入' - '程序显示您:':('。

示例输入:

+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
0
+
1
-
-
-
-
-
-
-
-
-
-
-

输出:

:)
:)
:)
:)
:)
:)
:)
:)
:)
:(
0
9
8
7
6
5
4
3
2
1
:(

我用两种方式解决了这个问题; 第一个代码: http://ideone.com/WNiNik#comments

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        List<int> list = new List<int>();
        for (; ; )
        {
            char sign = char.Parse(Console.ReadLine());

            switch (sign)
            {
                case '+':
                    {
                        if (list.Count >= 10) Console.WriteLine(":(");
                        else
                        {
                            int number = int.Parse(Console.ReadLine());
                            list.Add(number);
                        }
                        break;
                    }
                case '-':
                    {
                        if (list.Count == 0) Console.WriteLine(":(");
                        else
                        {
                            Console.WriteLine(list[list.Count - 1]);
                            list.Remove(list[list.Count - 1]);
                        }
                        break;
                    }

            }

        }


    }
}

第一个代码在Windows上运行良好,但在ideone.com上不起作用。

第二个代码: http://ideone.com/InDjF4

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        List<int> list = new List<int>();
        string x;
        while (((x = Console.ReadLine())) != null)
        {
            char sign = char.Parse(x);

            switch (sign)
            {
                case '+':
                    {
                        if (list.Count >= 10) Console.WriteLine(":(");
                        else
                        {
                            int number = int.Parse(Console.ReadLine());
                            list.Add(number);
                            Console.WriteLine(":)");
                        }
                        break;
                    }
                case '-':
                    {
                        if (list.Count == 0) Console.WriteLine(":(");
                        else
                        {
                            Console.WriteLine(list[list.Count - 1]);
                            list.Remove(list[list.Count - 1]);
                        }
                        break;
                    }

            }

        }


    }
}

第二代码在Windows和ideone.com上运行良好。我通过反复试验的方法来解决这个问题。有人可以解释一下为什么我的第一个代码出错了,这两个代码有什么区别?

1 个答案:

答案 0 :(得分:2)

这就是问题所在:

for (; ; )
{
    char sign = char.Parse(Console.ReadLine());
    ...
}

这将永远循环 - 代码中没有任何内容可以完全打破循环。

但是,Console.ReadLine()会在到达输入结束时返回null,此时您正在调用char.Parse(null),这会抛出异常。

你需要弄清楚如何干净地结束程序。

如果您将输入放入文件(例如input.txt)然后运行

,您可以在Windows上看到完全相同的结果
Program < input.txt