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)。
执行结果如下:
在C语言中,同样有getchar()函数,,C语言中调用getchar(),输入完字符敲Enter键后,伴随着字符进入输入流的,只有换行键。
C语言代码验证:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 bool flag = true; 6 char s; 7 int count =1; 8 while (flag) 9 { 10 printf("请输入字符M:"); 11 s = getchar(); 12 printf("\n"); 13 if( s=='M'||s=='m') 14 { 15 printf("输入正确,奖你2朵小红花%c%c。\n",(char)5,(char)5); 16 flag= false;//跳出循环用 17 } 18 else 19 { 20 printf(""); 21 printf("输入错误,这是第%d次输入错误,输入的字符ASCII值为%d,请输入正确字符!\n",count,(int)s); 22 count++; 23 } 24 } 25 system("pause"); 26 return 0; 27 }
分别输入M、A、ABC,(注:A的ASCII 值为65,B的ASCII 值为66,C的ASCII 为67,'\r'的ASCII 值为13,'\n'的ASCII 值为10)。
执行结果如下:
参考文献:
3.什么是缓冲区
9.C#console.readline输入值后回车程序直接结束了?
10.c#中的readline()与read的区别?搞不懂,详细点