'\r'与'\n'到底有何区别啊?请高手指教!

malligator 2005-12-13 12:31:42
在判断键盘输入字符是否是回车符,我们用'r'与'n'——一直一位它们是一样的。
但现在好像遇到一些问题了。如下程序:
//程序目的试从屏幕读入字符,放入vector中
public class read {
public static void main (String[] args) {
Vector v=new Vector();
char ch;
int i;
while (true){
try {
ch=(char)System.in.read();
if (ch!='\n') //在这里用'r'与'n'有区别了
v.addElement(new Character(ch));
else break;
} catch (IOException e) {e.printStackTrace();}
}
System.out.println(v);
i=v.size();
System.out.println(i);
}
}
我在屏幕中输入asdf(回车)
如用'\r',打印出来是"[a, s, d,f]",v.size是4;
但如果用'\n',打印出来是"]a, s, d,f,"(这个可能我的windows也有些问题,打印出来"[a, s, d,f,]"应该合理些),而v.size是5;
这就有点问题了。跟踪调试看到后者是把回车符也加入到v中来了,也就是说if语句判断的时候没有进入break;但既然如此,程序为什么能正常结束呢?等待键盘输入应该合理一些吧。
有一下三点疑问:
1)'\r'与'\n'到底有何区别?
2)打印出来"[a, s, d,f]"是不是套用了什么输出格式?能控制吗?没装Linux系统,有的朋友帮忙试试在Linux下是不是也这样。
3)在用'\n’的时候程序为什么能正常结束运行呢?

...全文
297 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mythling 2010-06-03
  • 打赏
  • 举报
回复
感觉我答的对就给分哦,呵呵。
java IDE和dos下输出结果不一样的。
mythling 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 malligator 的回复:]

给分怎么没给上呢
先不管了,吃饭先
一会再整
[/Quote]
\r是回车,不换行
而\n是换行。
为什么有的\r 打印是换号了,估计你是用ide编写输出打印的。你自己用记事本编写.java,然后在dos下编译运行就知道他的真正含义了。
malligator 2005-12-13
  • 打赏
  • 举报
回复
给分怎么没给上呢
先不管了,吃饭先
一会再整
malligator 2005-12-13
  • 打赏
  • 举报
回复
我试了一下,程序确实是像myhotsun(科科)说的那样。
虽然我很想知道为什么,毕竟按一个键返回两个码不太正常,但是
这似乎是编译器设计者/操作系统设计者们的问题,我们无法了解。
也就只有这样了。
至于myhotsun(科科)解释的打印成 "]a, s, d,f, "的原因,我觉得是不太妥当的(个人认为),因为\r会把原来的覆盖掉的吧——但它没有;而且还有逗号呢。我觉得可能是vector的toString()方法的实现问题,可惜没有编译器的处理过程,罢了~
chinatelly 2005-12-13
  • 打赏
  • 举报
回复
\r是回车
\n是换行
在windows下是一样的,但Unix下是不一样的。在国际标准中也是不一样的
myhotsun 2005-12-13
  • 打赏
  • 举报
回复
搂主的程序在windows如果输入"asdf",程序中接收到的全部字符"asdf\r\n",如果if (ch!='\n')那Vector的元素为“asdf\r”,如果是if (ch!='\r'),那Vector的元素为“asdf”。但是为什么会打印成"]a, s, d,f,"呢?分析如下:
由于此时Vector的元素为“asdf\r“,执行 System.out.println(v);的时候,v.toString()会自动执行,"\r"的作用光标移到行首,于是最后一个“]”覆盖原来首位的“[”,所以v.toString()得结果就变成了"]a, s, d,f,"。
pauliuyou 2005-12-13
  • 打赏
  • 举报
回复
顶,关注这个问题
Mr_Yang 2005-12-13
  • 打赏
  • 举报
回复
学习
malligator 2005-12-13
  • 打赏
  • 举报
回复
这个现象我是知道的;但好像不足以解决这个问题啊。
我是说那个if语句,既然用\n没有执行到else部分,那他为什么能顺利退出循环?!
还有第二个问题,我试过,如果vector里面是整数的话输出没有[,,]的格式的

感谢 Student02370236 &sswater(光杆兵)的热心解答!
weinickli 2005-12-13
  • 打赏
  • 举报
回复
听懂了~``原来如此
Student02370236 2005-12-13
  • 打赏
  • 举报
回复
/r和/n一个是回车一个是回车换行
这个是有一点历史原因的,这两个符号在过去都是控制针式打印机的,/r是控制针头移动到行首,/n是控制针头跳到下一行并且回到行首...
malligator 2005-12-13
  • 打赏
  • 举报
回复
顺便解答一下我的问题
malligator 2005-12-13
  • 打赏
  • 举报
回复
可能是我天生愚钝,但您说了对我来说跟没说没有什么区别:
我想知道的你都没说,你说的我都知道(除了linux的没有验证过外)。

哪位达人从流控制方面说一下
低调的小青蛙 2005-12-13
  • 打赏
  • 举报
回复
在搂主的程序中,最好使用:

BufferedReader in = new BufferedReader(System.in);

String line = null;
while( (line = in.readLine()) != null )
{
// line 就是一行,不包含 \r 或者 \n
}
低调的小青蛙 2005-12-13
  • 打赏
  • 举报
回复
不严格来说,在文本文件中,都可以用来作为换行:

\r\n - windows 用来换行
\n - linux 用来换行(好像是)
\r - 记不清(总之就是都可以用来作为换行)

对于 java 来说,上面3种用法都会被识别为换行符。也就是说 BufferedReader 中 readLine 遇到这3种情况都会识别为一行结束。
低调的小青蛙 2005-12-13
  • 打赏
  • 举报
回复
严格来说:

\r 表示 return
\n 表示 new line

打印的时候,

\r 使光标移动到当前行的第一列
\n 使光标移动到下一行的相同列

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧