前置知识
换行符号(\r\n)的历史 - 小林野夫 - 博客园
\r\n与\n是有区别的。 如果要通用的则是\r\n,因为有些编辑器它不认\n
“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别: 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即“\n”;
Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;(然后下面的情况却不是这样
)
控制台应用程序 换行\n
Mac系统里,每行结尾是“<回车>”,即\r。
一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
c语言编程时(windows系统)\r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉 如: int main() { cout << “hahaha” << “\r” << “xixi” ; } 最后只显示 xixi 而 hahaha 被覆盖了 \n 是回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉 int main() { cout << “hahaha” << “\n” << “xixi” ; } 则 显示 hahaha xixi \r\n是输出的HTML代码换行,客户看到的效果没有换行。 则相反 效果: 我是内容\r\n我是内容
我是内容 我是内容
================================================== \r 表示:回车符(ACSII:13 或0x0d),就是我们常说的硬回车。 \n 表示:换行(ACSII:10 或0x0a),就是我们常说的软回车。
在页面里这两个是看不到效果的.右键查看源文件可以看到代码换行
================================================== 如果是输出给浏览器,就用 如果是输出到自己的文件里,就用"\n",windows下是"\r\n"
================================================== \n,好比你在DreamWeaver里做一个网页,在源代码里按一下回车,是给源代码换行。 是输出一个(HTML标记性语言),在HTML中解释为输入的字换行。 \n的作用是给源代码换行,输入后,查看HTML源代码,就看会到有换行,而HTML解释器(浏览器)认为它是没用的东西,用不用都一样显示。
问题探究
import java.io.*;
public class Accept {
public static void main(String[] args) {
int c = 0;
String s = "";
System.out.println("输入摄氏度:(0<数值<100)");
try {
while (c != 10) {
c = System.in.read();//idea里按下enter只有\n,没有\r,eclipse里是\r\n其他的也是,应该是idea的特性吧
//System.out.println(c);
s += String.valueOf((char) c);
}
} catch (Exception e) {
e.printStackTrace();
}
int celsius = Integer.parseInt(s.trim());//trim()去掉头尾空白字符,也能去除一些转义字符如:\n,\t;
double f = 1.8 * celsius + 32;
System.out.println("转化成华氏度为: " + f);
问题的出现及分析
遇到的问题是也就是enter键的问题,刚刚上面提到
Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;(
然后下面的情况却不是这样
也是说,当你按下Enter键的时候,会输入“\n\r”
先读入
\n
,然后是\r
,对应这10
和13
(对应的ASCII码),然后我遇到的问题就是Enter键按下的时候只有\n
,却没有\r
,调试了半天,找了各种资料,才发现是idea编译器的问题,这里感谢这个人文章,读了他的文章之后,试了试Eclipse,发现Enter符合上述描述,没有问题,看来就是idea的问题。
代码讲解
首先,这个代码的所用是把摄氏度转换成华氏度。
然后要求是用read()函数来读取,所以写的有点麻烦。
这里讲一下代码中的函数的用法:
1.read()和read(byte[] b):
这两个方法在抽象类InputStream中都是作为抽象方法存在的
JDK API中是这样描述两者的:
read() : 从输入流中读取数据的下一个字节,返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
read(byte[] b) : 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。
如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。
将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到b[b.length-1] 的元素。