在判断键盘输入字符是否是回车符,我们用'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’的时候程序为什么能正常结束运行呢?
但现在好像遇到一些问题了。如下程序:
//程序目的试从屏幕读入字符,放入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’的时候程序为什么能正常结束运行呢?
\n 表示 new line打印的时候,\r 使光标移动到当前行的第一列
\n 使光标移动到下一行的相同列
\n - linux 用来换行(好像是)
\r - 记不清(总之就是都可以用来作为换行)对于 java 来说,上面3种用法都会被识别为换行符。也就是说 BufferedReader 中 readLine 遇到这3种情况都会识别为一行结束。
while( (line = in.readLine()) != null )
{
// line 就是一行,不包含 \r 或者 \n
}
我想知道的你都没说,你说的我都知道(除了linux的没有验证过外)。哪位达人从流控制方面说一下
这个是有一点历史原因的,这两个符号在过去都是控制针式打印机的,/r是控制针头移动到行首,/n是控制针头跳到下一行并且回到行首...
我是说那个if语句,既然用\n没有执行到else部分,那他为什么能顺利退出循环?!
还有第二个问题,我试过,如果vector里面是整数的话输出没有[,,]的格式的 感谢 Student02370236 &sswater(光杆兵)的热心解答!
由于此时Vector的元素为“asdf\r“,执行 System.out.println(v);的时候,v.toString()会自动执行,"\r"的作用光标移到行首,于是最后一个“]”覆盖原来首位的“[”,所以v.toString()得结果就变成了"]a, s, d,f,"。
\n是换行
在windows下是一样的,但Unix下是不一样的。在国际标准中也是不一样的
虽然我很想知道为什么,毕竟按一个键返回两个码不太正常,但是
这似乎是编译器设计者/操作系统设计者们的问题,我们无法了解。
也就只有这样了。
至于myhotsun(科科)解释的打印成 "]a, s, d,f, "的原因,我觉得是不太妥当的(个人认为),因为\r会把原来的覆盖掉的吧——但它没有;而且还有逗号呢。我觉得可能是vector的toString()方法的实现问题,可惜没有编译器的处理过程,罢了~
而\n是换行。
为什么有的\r 打印是换号了,估计你是用ide编写输出打印的。你自己用记事本编写.java,然后在dos下编译运行就知道他的真正含义了。
java IDE和dos下输出结果不一样的。