数组扩容中发现的问题(next,nextLine,print,println)

 

目录

数组扩容代码:

问题1: Scanner中的 nextInt() 后面不能直接跟 nextLine();

问题2:next 与 nextLine 的区别

 总结:

问题3:print 与 printLine 的区别

拓展:printf


数组扩容代码:

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        int[] a = { 1, 2, 3 };
        Scanner myScanner = new Scanner(System.in);
        do {
            int[] newa = new int[a.length + 1];
            for (int i = 0; i < a.length; i++) {
                newa[i] = a[i];
            }
            
            int addnum = Integer.parseInt(myScanner.next());
            //int addnum = myScanner.nextInt();

            newa[a.length] = addnum;
            a = newa;
            System.out.printf("a扩容后的元素情况:\n");
            for (int i = 0; i < a.length; i++) {
                System.out.print(a[i] + "\t");
            }
            System.out.println("是否继续扩容(y/n)");
            char key = myScanner.next().charAt(0);
            if (key == 'N' || key == 'n') {
                break;
            }
        } while (true);

        System.out.println("数组扩容完毕");

        // 扩容之后数组遍历
        System.out.print("[");
        for (int i = 0; i < a.length; i++) {
            if (i == a.length - 1) {
                System.out.print(a[a.length - 1] + "]");
            } else {
                System.out.print(a[i] + ", ");
            }
        }

    }
}

问题1: Scanner中的 nextInt() 后面不能直接跟 nextLine();

nextLine()并未读取任何输入,直接转到了下一行。
问题分析(缓冲区问题):
 nextLine()会把 nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下一条语句执行。
————————————————
原文链接:https://blog.csdn.net/gg543012991/article/details/52900592

参考资料:https://cloud.tencent.com/developer/article/1970125


问题2:next 与 nextLine 的区别

next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。

nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

next()在输入有效字符之后,将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。

注意:在有效字符前的空格,Tab键,Enter键等不被next读取,从输入第一个有效字符后的空格,Tab键,Enter键等才会被视为结束符。(包括分隔的空格都会保留在缓存区域)

nextLine()方法的结束符只是Enter键

nextLine则不管是否读取到有效字符,只要输入Enter即结束(就算直接输入Enter也是直接结束)

 总结:

Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是  空白符;比如空格,回车,tab 等等。

 

next()方法读取到空白符就结束l;

nextLine()读取到回车结束也就是“\r”;

所以没还顺序前测试的时候next()再检测到空格的时候就结束输出了。

修改顺序后遇到的问题是因为next()读取到空白符前的数据时结束了,然后把回车“\r”留给了nextLine();所以上面nextLine()没有输出,不输出不代表没数据,是接到了空(回车“/r”)的数据。

 ————————————————
参考资料:
https://blog.csdn.net/superme_yong/article/details/80543995

参考资料:htztps://blog.csdn.net/zxfly6/article/details/80514903

数组扩容里若两个输入修改为 next 和 nextLine 报错的原因

next:输入6+Enter(\n)

报错内容:

StringIndexOutOfBoundsException: String index out of range: 0

可能原因:

next输入有效字符后直接接回车会将回车(\n)以及后面的内容留在缓存区里,

nextLine读取到回车(\n)直接结束故报错

next:输入6+空格+回车(\n)

未报错(空格停止了对后面回车(\n)的录取?)X

nextLine:输入y

报错内容:

NumberFormatException: For input string: "y"(数字格式化异常)

原因:

数字格式化异常指输入的字符串String里必须是数字类型(由于Integer的强转引起)
说明输入的y是被nextLine读取而非next读取,nextLine读取到的应该是回车(\n)

尝试不用回车(\n)只用空格但是仍会报错StringIndexOutOfBoundsException

故建议不要 next 和 nextLine 连用。


问题3:print 与 printLine 的区别

print()方法和println()方法的不同就是后者在把数据压入缓冲区之后还调用flush方法把缓冲区中的数据推到和操作系统交互的流中,然后操作系统和硬件交互从而显示出控制台信息,print()若是输出的字符串中含有’\n’,则换行符前面的内容会直接显示出来,而换行符之后的内容则会暂存到缓冲区,直到调用下一次的flush方法或者遇到下一个换行符
————————————————
原文链接:https://blog.csdn.net/u012504392/article/details/109888572

参考资料:https://blog.csdn.net/a594218234/article/details/108769756

printLine结束会进行换行,但不一定是(\n)它会根据操作系统的不同而变换。

Windows:\r\n                Mac:\r                Unix:\n

java编译器里 \n 是进行换行(为什么在Windows环境下Java语言用 \n 进行换行?)

参考资料:https://www.zhihu.com/question/393633838

拓展:printf

printf() 是JDK5之后才有的,f的意思就是format,也就是格式化。用在System. out上,就是对输出的文字做格式化后再显示在文本模式中。

printf()的第一个自变量是字符串,其中 %d、%h、%b 等是 格式控制符号 。格式控制符号有以下:

          符号                                                                说明
          %%因为%符号已经被用来作为控制符号前置,所以规定使用%%才能在字符串中表示%
          %d以十进制整数格式输出,可用于byte、short、int、long、Byte、Short、Integer、Long、BigInteger
          %f以十进制浮点数格式输出,可用于float、double、Float、Double或者BigDecimal

          %e

以科学记号浮点数格式输出,提供的数必须是float、double、Float、Double或者BigDecimal。%e表示输出格式遇到字母以小写表示,如2.13e+12,%E则表示遇到字母以大写表示
          %b输出boolean值,%b表示输出结果会是true或false,%B表示输出结果会是TRUE或FALSE。非null值输出是true或TRUE,null值输出是false或FALSE
          %h使用Integer.toHexString(arg.hashCode())来得到输出结果,如果arg是null,则输出null,也常用于想得到十六进制格式输出
          %x以十六进制整数格式输出,可用于byte、short、int、long、Byte、Short、Integer、Long、BigInteger。%x表示输出格式遇到字母以小写表示,%X则表示遇到字母以大写表示
          %s字符串格式符号
          %c以字符符号输出,可用于byte、short、char、Byte、Short、Integer或者Charcater。%c表示输出格式遇到字母以小写表示,%C则表示遇到字母以大写表示
          %n输出平台特定的换行符号,如果Windows下则会置换为”\r\n”,如果是Linux下则会置换为’\n’,如果Mac OS下回置换为’\r’

参考资料:https://blog.csdn.net/weixin_44538399/article/details/89083619

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值