C#中Console.Read()与Console.ReadLine()的区别

    在写Console.Read()与Console.ReadLine()之前,我们先讨论一个问题。

    每一个会用计算机的人,都有这个经验,即当我们用Word编写文章的时候,敲一下键盘上的Enter键,光标就会换行。这个Enter键盘,我们通常都叫它回车键。在计算机科学中,回车和换行是两个概念。在编程语言中,回车用\t(反斜杠t)表示,换行用\n(反斜杠n)表示。既然我们敲的是回车键,为什么光标换行了呢?按理说,我们只有敲了换行键,光标才能换行呀!

 可是,我们都知道,键盘上,只有回车键,没有换行键。

    那么问,回车与换行有什么区别呢?

 一、回车与换行的区别1

    名词释义

    CR:Carriage Return,对应ASCII中转义字符\r,表示回车;

    LF:Linefeed,对应ASCII中转义字符\n,表示换行 ;

    CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行 

    从技术发展史上讲,回车和换行是机械打字机时代的概念。据野史记载,在很久以前的机械打字机时代,回车和换行分别具有不同的作用:LF会将打印纸张上移一行位置,但是保持当前打字的水平位置不变;CR则会将“Carriage”(打字机上的滚动托架)滚回到打印纸张的最左侧,但是保持当前打字的垂直位置不变,即还是在同一行。 在今天来说,回车和换行是针对光标而言的,所谓回车,就是光标水平回到所在行的做左侧;所谓换行,就是让光标垂直进入下一行。从这个意义上说,我们在键盘上敲Enter键换行的时候,在计算机内部,其实上对应的是两个操作,一个是回车,一个是换行

二、Console.Read()与Console.ReadLine()的区别

    相同点:两者都是用于输入的函数

    不同点:1.Read()每次只能读取一个字符;ReadLine()每次能读取一个字符串。

      2.Read()返回值是输入字符的ASCII码的十进制值;ReadLine()返回值是输入的字符串。

               3.read()方法在键入enter时终止,并且会在输入内容后面追加行终止序列。按 Enter 会将依赖于平台的行终止序列追加到输入 (Windows追加回车符换行序列) 。read()时从缓冲区读入单个字符的int 类型,  在使用read()时,注意如果使用回车(enter)结束时,就会把换行和回车符一同放入缓冲区。这一点特别重要。(关于c# read( )使用注意缓冲区赘余输入(附代码)

     4.ReadLine(),只读字符,不读回车和换行符。缓冲区里的字符如果还有回车和换行,ReadLine()不读回车和换行。

关于两个函数的前两点区别,从这两篇博文中学到(C#中Read()和ReadLine()区别C#中Console.Read()、Console.ReadLine()、Console.ReadKey()的区别

对于第1点区别,亲测一下试一下,测试代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8     class Program
 9     {
10        
11         static void Main(string[] args)
12         {
13             int test_int;   
14             Console.Write("请输入字符串:");
15             test_int = Console.Read();
16             Console.WriteLine("输入字符的ASCII值:{0}", test_int);
17 
18             Console.ReadKey();
19         }
20     }
21 }

输入A和ABC,分别运行一次,结果如下图所示:

 对于第2点区别,测试代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8     class Program
 9     {
10 
11         static void Main(string[] args)
12         {
13             string test_string;
14             Console.Write("请输入字符串:");
15             test_string = Console.ReadLine();
16             Console.WriteLine("输入的字符串是:{0}",test_string);
17 
18             Console.ReadKey();
19         }
20     }
21 }

分别输入A和ABC,执行结果如下:

 关于第3点区别,我们先看一下Read(),用下面语句来验证:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8     class Program
 9     {
10 
11         static void Main(string[] args)
12         {
13             Boolean flag = true;
14             char s;
15             int count = 1;
16             while (flag)
17             {
18                 Console.WriteLine("请输入字符M:");
19                 s = (char)Console.Read();    // 缓冲区 里存入啦 字符 回车 换行 三个字符(假如输入1个字符的话,如果输入N个字符,此处三应为N+2) 会挨个读入 所以会三(N+2)次错误
20                 if (s == 'M' || s == 'm')
21                 {
22                     flag = false;
23                     Console.WriteLine("输入正确,奖你2朵小红花{0}{0}。",Convert.ToChar(5));//小红花的ASCII值为5
24                 }
25                 else
26                 {
27                     Console.WriteLine("输入错误,这是第{0}次输入错误,输入的字符ASCII值为{1},请输入正确字符!", count, Convert.ToInt32(s));
28                     count++;
29                 }
30             }
31             Console.ReadKey();
32         }
33     }
34 }

 我们分别输入M、A和ABC(注:A的ASCII 值为65,B的ASCII 值为66,C的ASCII 为67,'\r'的ASCII 值为13,'\n'的ASCII 值为10)。

执行结果如下:

 

 

 而对于ReadLine()(即第4点所述),我们用两段代码对比验证下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8     class Program
 9     {
10        
11         static void Main(string[] args)
12         {
13             Console.Write("请输入字符串ABC:");
14             int i = Console.Read();
15             char chr = (char)i;
16             Console.WriteLine("Read()读取的字符是:" + chr);
17 
18             string str = Console.ReadLine();
19             //string str = "BC\r\n";
20             Console.Write("变量str保存的字符串是:"+str);
21 
22             Console.ReadKey();
23         }
24     }
25 }  

 输入ABC,执行结果:

此刻,字符串变量str保存的值,即为ReadLine()读取的值,注意,光标在BC后面紧挨着,说明ReadLine()没有读取缓冲区里的回车和换行。

我们把上述代码18行注释掉,把19行的注释取消掉,再输入ABC执行,执行结果:

可以看到,光标回车换行了。两相对比,可以看出,第一次的str,ReadLine()对其赋值的时候,并没有回车和换行。第二次,我们手动添加回车和换行,光标就回车换行了。

三、补充知识

上述是在C#语言中的探究。

对于上述第3点,在C++语言中,有一个函数,功能跟Read()是一样的,都是从键盘获取字符放入输入流中去,这个函数叫getchar()。

但是,两个函数又有点小区别。如前所述,Read()函数在你输入完字符敲Enter键后,伴随着字符进入输入流的还有回车键和换行键。

但是,C++中调用getchar(),输入完字符敲Enter键后,伴随着字符进入输入流的,只有换行键。

C++代码验证:

 1 #include <iostream>
 2 #include <stdlib.h>
 3 using namespace std;
 4  
 5 int main()
 6 {    
 7     bool flag = true;
 8     char s;
 9     int count =1;
10     while (flag)
11     {
12         cout<<"请输入字符M:"<<endl;
13         s = getchar();
14 
15         if( s=='M'||s=='m')
16         {
17             cout<<"输入正确,奖你2朵小红花"<<(char)5<<(char)5<<""<<endl;
18             flag= false;//跳出循环用
19         }
20         else 
21         {
22             cout<<"输入错误,这是第"<<count<<"次输入错误,输入的字符ASCII值为"<<(int)s<<",请输入正确字符!"<<endl;
23             count++;
24         }
25     }
26     system("pause");
27     return 0;
28 }

分别输入M、A、ABC,(注:A的ASCII 值为65,B的ASCII 值为66,C的ASCII 为67,'\r'的ASCII 值为13,'\n'的ASCII 值为10)。

执行结果如下:

 

 参考文献:

1.回车与换行的区别,CRLF、CR、LF详解。

2.什么是缓冲区(buffer),什么是缓存(cache)

3.什么是缓冲区

4.Console.Read 方法

5.Console.ReadLine 方法

6.使用readLine()方法遇到的坑

7.使用readLine()方法遇到的坑

8.被readLine()折腾了一把

9.C#console.readline输入值后回车程序直接结束了?

10.c#中的readline()与read的区别?搞不懂,详细点

11.记一次关于字符缓冲流的readline判断是否直接输入回车的问题

12.C#中怎样判断接收的输入是不是回车啊?

13.C++中getchar()的使用方法

posted @ 2022-06-10 01:13  美人她爹  阅读(1262)  评论(0编辑  收藏  举报