黑马程序员技术交流社区

标题: 有关转义字符的问题 [打印本页]

作者: 燕国庆    时间: 2012-9-23 14:12
标题: 有关转义字符的问题
class HuanHang
{
public static void main(String[] args)
{
  System.out.println("123\n456");                     
  System.out.println("--------------------------");
  System.out.println("123\r\n456");
  System.out.println("--------------------------");
  System.out.println("123\r456");
}
}
第一个输出语句与第三个输出语句有什么不同?

第五个输出语句是什么意思?为什么输出的是456 那?,求帮解释,谢谢!!!


作者: 尤圣回    时间: 2012-9-23 14:34
class HuanHang
{
public static void main(String[] args)
{
  System.out.println("123\n456");                     
  System.out.println("--------------------------");
  System.out.println("123\r\n456");
  System.out.println("--------------------------");
  System.out.println("123\r456");
}
}
第一个输出语句与第三个输出语句有什么不同?   第一句和第三句都是回车换行
第五个输出语句是什么意思?为什么输出的是456 那?,求帮解释,谢谢!!!  这句不是456 是 123
456


打印结果123
456
--------------------------
123
456
--------------------------
123
456

作者: 黑马杨晨    时间: 2012-9-23 14:35
\n 回车 \r 换行  在java中使用这两个转义字符的时候 "\n\r"表示回车并换行与"\r\n"一样, 要想实现通过转义字符的换行或者是回车, 要把二者一起使用,单独的使用"\n"或"\r"是完全无意义的。

作者: 赵永康    时间: 2012-9-23 15:57
可以给你看看换行的代码
class SystemIn
{
        public static void main(String[] args)throws IOException
        {
                InputStream in=System.in;//因为System.in返回值就是InputStream
                StringBuilder sb=new StringBuilder();
                while(true)
                {
                        int ch=in.read();
                        if(ch=='\r')
                                continue;
                        if(ch=='\n')
                        {        String s= sb.toString();
                                if("over".equals(s))
                                     break;
                                System.out.println(s.toUpperCase());
                                sb.delete(0,sb.length());
                        }
                        else       
                                sb.append((char)ch);
                }
               
        }
}

作者: 燕国庆    时间: 2012-9-23 16:13
本帖最后由 燕国庆 于 2012-9-23 16:16 编辑
尤圣回 发表于 2012-9-23 14:34
class HuanHang
{
public static void main(String[] args)


D:\javaprogram1\day02>java HuanH
123
456
--------------------------
123
456
--------------------------
456最后一个输出语句是456,不是123 456呀 在我的机器上运行,说句实话我还不明白,哎




1

作者: 吴兵    时间: 2012-9-23 22:47
很奇怪,试了下在eclipse下和cmd下执行的结果是不一样的


应该是eclipse和cmd对 \r 的处理不一样吧
作者: 杜正华    时间: 2012-9-24 10:59
  1. 123
  2. 456
  3. --------------------------
  4. 123
  5. 456
  6. --------------------------
  7. 123
  8. 456
  9. \r回车  \n换行 编译器不同,结果不同
复制代码

作者: 陈虹旭    时间: 2012-9-24 12:10
呵呵 楼主不用着急,不是你机器的问题哦 !虽然我不知道这是什么原因,也想同求下哪位高手可以解释这个现象!
而且我试过楼主的代码,还发现了一个新现象,诧异不已,楼主试试这段代码:
  1. class HuanHang
  2. {
  3. public static void main(String[] args)
  4. {
  5.   System.out.println("123\n456");                     
  6.   System.out.println("--------------------------");
  7.   System.out.println("123\r\n456");
  8.   System.out.println("--------------------------");
  9.   System.out.println("   123\r456");
  10. }
  11. }
复制代码
仅仅是多了几个空格而已:
在/r加空格会显示在456前出现空格
而在123前加空格却是
一个空格显示:4563
两个空格显示:45623
三个空格显示:456123

有哪位高手给解释下这到底是怎么回事呢?估计要是面试出现这样的题目我就挂了!
作者: 燕国庆    时间: 2012-9-24 14:40
陈虹旭 发表于 2012-9-24 12:10
呵呵 楼主不用着急,不是你机器的问题哦 !虽然我不知道这是什么原因,也想同求下哪位高手可以解释这个现象 ...

\r 就是return  回到 本行 行首  这就会把这一行以前的输出 覆盖掉

如:
int main() {

cout << "hahah" << "\r" << "xixi" ;


}
最后只显示 xixi 而 hahah 背覆盖了

\n 是回车+换行  把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉

int main() {

cout << "hahah" << "\n" << "xixi" ;


}
则 显示
hahah
xixi
我感觉应该是这样的过程
作者: 陈虹旭    时间: 2012-9-24 15:13
燕国庆 发表于 2012-9-24 14:40
\r 就是return  回到 本行 行首  这就会把这一行以前的输出 覆盖掉

如:

嗯 应该是这样吧  学习了  呵呵
作者: 冯伟    时间: 2012-9-24 15:48
本帖最后由 冯伟 于 2012-9-24 15:49 编辑

\r\n 是windows的换行命令,一般是在往文件中输入文字时换行用,在其它如Linux系统上没用的。在控制台输出一般用\n换行,如果往文件中输出时换行考虑到跨平台性就不能用转义字符了,可以用Java提供的方法来换行
\r是归位的意思,就是光标回到该行首位,如果它的后面有字符时就擦除一个写一个,例如"123456\rabc",因为\r 后有三个字符,所以输出为   
abc456
前面的123被擦除了,





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2