换行符和回车符

2019-01-06  本文已影响0人  luckee

来源

换行和回车容易搞混淆,其实它们是有区别的

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。 于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

转义字符

在字符集里面,每个字符都有一个唯一的编号,计算机存储字符就是存储它的编号,向我们展示则展示可以用人类语言看懂和书写的字符,比如字母,数字等。但是有的字符却不那么好表示,比如回车、换行,因此我们采取/+字母或数字这样的形式来表示这些特殊的字符,当然这只是对于人类来说的,计算机仍然还是存储特殊字符的编号就行了。

转义字符.png

Scanner的坑

当我们使用Scanner in = new Scanner(Syetem.in)来获取键盘输入的时候,获取一行输入方法nextLine()和其他的获取数值方法如nextInt()有一些小的区别,如果我们没搞清楚,就容易陷入其中的坑,还觉得莫名其妙的。一般我们输入完成时按下回车键告诉程序本行输入结束。考虑下面的代码,一直获取键盘的输入并打印到控制台,直至按下ctrl + c

import java.util.Scanner;
class ScannerTest {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String s = in.nextLine();
            int a = in.nextInt();
            //String s1 = nextLine();//吸收掉上次余留的换行符
            System.out.println(s);
            System.out.println(a);
        }
    }
}

下面为运行结果,有红色下划线的为输入:


ScannerTest 运行结果.png

可以看到在第二轮输入hello的时候报错,提示输入不匹配。我们先说明两个方法的区别:Scanner会使用一个缓存来保存用户的输入,并在输入的末尾加上一个“\n”。当用户输入回车键,Scanner就会从缓存区读取内容赋值给程序的变量,读取了的内容将被从缓冲区清除掉。nextInt方法接收整型字符,只读取缓冲区中前面部分的数字字符,不会读取“\n”字符,所以“\n”字符被留在缓冲区。nextLine读入一行文本,会读取整个缓冲区,包括”\n”字符,但并不会返回“\n”给程序的变量。第一轮输入hello,赋值给s;然后输入3赋值给a,但是注意,scanner对象并没有读取末尾的换行符,所以在第二轮的时候,还没等我输入hello,上一轮余留下的换行符就赋值给s了,当我输入第二轮的hello时,scanner对象就将hello赋值给a,所以导致输入不匹配。添加一行(代码中注释的那行)后没问题了,有红色下划线的为键盘输入(编译的时候报错,编码GBK的不可映射字符,编译的时候指定-encoding UTF-8)


ScannerTest 运行结果.png
上一篇 下一篇

猜你喜欢

热点阅读