在判断键盘输入字符是否是回车符,我们用'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’的时候程序为什么能正常结束运行呢?

解决方案 »

  1.   

    严格来说:\r 表示 return
    \n 表示 new line打印的时候,\r 使光标移动到当前行的第一列
    \n 使光标移动到下一行的相同列
      

  2.   

    不严格来说,在文本文件中,都可以用来作为换行:\r\n  - windows 用来换行
    \n    - linux 用来换行(好像是)
    \r    - 记不清(总之就是都可以用来作为换行)对于 java 来说,上面3种用法都会被识别为换行符。也就是说 BufferedReader 中 readLine 遇到这3种情况都会识别为一行结束。
      

  3.   

    在搂主的程序中,最好使用:BufferedReader in = new BufferedReader(System.in);String line = null;
    while( (line = in.readLine()) != null )
    {
        // line 就是一行,不包含 \r 或者 \n
    }
      

  4.   

    可能是我天生愚钝,但您说了对我来说跟没说没有什么区别:
    我想知道的你都没说,你说的我都知道(除了linux的没有验证过外)。哪位达人从流控制方面说一下
      

  5.   

    /r和/n一个是回车一个是回车换行
    这个是有一点历史原因的,这两个符号在过去都是控制针式打印机的,/r是控制针头移动到行首,/n是控制针头跳到下一行并且回到行首...
      

  6.   

    这个现象我是知道的;但好像不足以解决这个问题啊。
    我是说那个if语句,既然用\n没有执行到else部分,那他为什么能顺利退出循环?!
    还有第二个问题,我试过,如果vector里面是整数的话输出没有[,,]的格式的 感谢 Student02370236 &sswater(光杆兵)的热心解答!
      

  7.   

    搂主的程序在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,"。
      

  8.   

    \r是回车
    \n是换行
    在windows下是一样的,但Unix下是不一样的。在国际标准中也是不一样的
      

  9.   

    我试了一下,程序确实是像myhotsun(科科)说的那样。
    虽然我很想知道为什么,毕竟按一个键返回两个码不太正常,但是
    这似乎是编译器设计者/操作系统设计者们的问题,我们无法了解。
    也就只有这样了。
    至于myhotsun(科科)解释的打印成  "]a,  s,  d,f,  "的原因,我觉得是不太妥当的(个人认为),因为\r会把原来的覆盖掉的吧——但它没有;而且还有逗号呢。我觉得可能是vector的toString()方法的实现问题,可惜没有编译器的处理过程,罢了~
      

  10.   

    \r是回车,不换行
    而\n是换行。
    为什么有的\r 打印是换号了,估计你是用ide编写输出打印的。你自己用记事本编写.java,然后在dos下编译运行就知道他的真正含义了。
      

  11.   

    感觉我答的对就给分哦,呵呵。
    java IDE和dos下输出结果不一样的。