美文网首页
换行符和回车符

换行符和回车符

作者: luckee | 来源:发表于2019-01-06 16:45 被阅读0次

    来源

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

    • 换行符:作用为新(new)建一行,转义表示\n
    • 回车符:作用为将光标回到(return)行首,转义表示\r

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

    • Unix系统里,每行结尾只有“<换行>”,即“\n”;
    • Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;
    • Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。 java中可以通过System.getProperty("line.separator")来获取

    转义字符

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

    转义字符.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

    相关文章

      网友评论

          本文标题:换行符和回车符

          本文链接:https://www.haomeiwen.com/subject/tbvsrqtx.html