Console.Read() - 需要字符串输出,而不是数字

时间:2014-06-25 20:15:09

标签: c# console

所以我正在创建一个应用程序,我必须使用Console.Read,因为我希望在某个事件中重写该行,所以我不能使用Console.ReadLine()。问题是我的应用程序不输出字符串,而是输出多行数字。我试过这行代码。如果您需要更多代码示例,请发表评论。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace einuorg_console
{
    class UDPserver
    {
        private static string DatePattern = "HH:mm:ss";

        public static void Initialize(string IPaddress, int port)
        {
            Boolean done = false;
            Boolean exception_thrown = false;
            Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPAddress sendto_address = IPAddress.Parse(IPaddress);
            IPEndPoint sending_endpoint = new IPEndPoint(sendto_address, port);

            Console.Write("[" + DateTime.Now.ToString(DatePattern) + "]  ");
            Console.WriteLine("einuorg.UDPserver Initialized on address " + IPaddress + ":" + port.ToString());
            while (!done)
            {
                Console.Write("[********]");

                string text_to_send = Console.Read().ToString();

                if (text_to_send.Length == 0)
                {
                    done = true;
                }
                else
                {
                    byte[] sendbuffer = Encoding.ASCII.GetBytes(text_to_send);
                    try
                    {
                        sending_socket.SendTo(sendbuffer, sending_endpoint);
                    }

                    catch (Exception send_exception)
                    {
                        exception_thrown = true;
                        Console.WriteLine(" Exception {0}", send_exception.Message);
                    }

                    if (exception_thrown == false)
                    {
                        Console.WriteLine("\r");
                        Console.Write("[" + DateTime.Now.ToString(DatePattern) + "]  ");
                        Console.WriteLine(text_to_send);
                    }
                    else
                    {
                        exception_thrown = false;
                        Console.WriteLine("The exception indicates the message was not sent.");
                    }
                }
            }
        }
    }
}

终端类似于Console类,但有更多选项,我构建的东西。

1 个答案:

答案 0 :(得分:1)

Console.Read返回一个Int32:" [t]来自输入流的下一个字符,如果当前没有更多字符要读取,则返回负一(-1)。"当你写作时,你只是在该值上调用ToString,所以你除了数字之外什么也看不见。您需要检查返回值是否为-1,如果不是则转换为char

还有一个Console.ReadKey方法,它为您提供一个包含KeyChar属性的对象。它可能更容易使用。

根据您的评论,您可能会遇到类似的事情:

    public static string ReadLine()
    {
        bool done = false;
        StringBuilder sb = new StringBuilder();
        while (!done)
        {
            ConsoleKeyInfo key = Console.ReadKey(true);
            switch(key.Key)
            {
                case ConsoleKey.Enter:
                    done = true;
                    break;
                case ConsoleKey.Backspace:
                    sb.Length -= 1;
                    Console.Write(key.KeyChar);
                    Console.Write(" ");
                    Console.Write(key.KeyChar);
                    break;
                default:
                    sb.Append(key.KeyChar);
                    Console.Write(key.KeyChar);
                    break;
            }
        }
        }
        return sb.ToString();
    }

该功能可能会被清理一下。它可能不会用于箭头键。它会将您的Console.Read行替换为:

string text_to_send = ReadLine();

这会在用户输入后离开当前行,因为Enter键永远不会回显到控制台。之后,您可以执行覆盖逻辑并在闲暇时移动到下一行。

作为替代方案,您可以使用Console.ReadLine,然后将光标向上调整一行:

    public static string ReadLine2()
    {
        string input = Console.ReadLine();
        Console.CursorTop -= 1;
        return input;
    }