输入在 do-while 循环中无法与 Scanner 类一起使用

Posted

技术标签:

【中文标题】输入在 do-while 循环中无法与 Scanner 类一起使用【英文标题】:Input not working with Scanner class in the do-while loop 【发布时间】:2021-06-08 13:37:24 【问题描述】:

在 do-while 循环中,代码在第一种情况后不接受输入。它在接受输入后被终止并且没有正确执行do-while循环。z = sc.nextLine()有什么问题在while循环中 还是 Scanner 类? PS:我也试过 Scanner sc=new Scanner("System.in");但代码仍然不起作用。 除了 parseInt() 之外的任何其他选择?

输出: 堆栈大小? 5 1.推 2.POP 3.显示 1 推号? 19 继续? 继续后,代码被终止

请帮忙。

class stak
   int tos=-1;
   int size;
   int a[];
   
   stak(int l)
       size=l;
       tos=-1;
       a=new int[l];
   
   void push(int x)
       if(tos==size-1)
           System.out.println("Stack Overflow");
       
       else
           a[++tos]=x;
       
   
   void pop()
       if(tos<0)
           System.out.println("Stack Underflow");
       
       else
           System.out.println(a[tos--]);
       
   

   void display()
       if(tos>=0)
           for(int i=tos;i>=0;--i)
               System.out.println(a[i]);
           
       
       else
       System.out.println("Stack is Empty");
   



public class stack
   public static void main(String args[])
      Scanner sc=new Scanner(System.in);
      System.out.println("size of stack?");
      int n=sc.nextInt();
      stak s1=new stak(n);
      String z;
      do
      System.out.println("1.PUSH");
      System.out.println("2.POP");
      System.out.println("3.Display");
      int ch=sc.nextInt();
      
      switch(ch)
           case 1 : System.out.println("number for push?");
                   int p=sc.nextInt();
                   s1.push(p);
                   break;
                   case 2 : System.out.println("POP!");
                   s1.pop();
                   break;
                   case 3 : System.out.println("Display!");
                   s1.display();
                   break;
                   default: System.out.println(" OOPS! owner says only take input as: 1,2,3");
                   break;
      
     System.out.println("continue?");
    z=sc.nextLine(); 
   while(z.equals("yes")|| z.equals("y"));
   sc.close();




 [1]: https://i.stack.imgur.com/BHZQO.png

【问题讨论】:

这能回答你的问题吗? Scanner is skipping nextLine() after using next() or nextFoo()? 您能否在您的问题中添加一些示例输入,以及您期望的行为是什么 以文本形式添加的输出 好的,根据该输入,我相信@maloomeister 评论中的链接将解决您的问题 【参考方案1】:

问题出在扫描仪类上。因为当您使用 call z=sc.nextLine(); 时,此调用首先从您输入要压入堆栈的数字的行中获取输入,因为 int p=sc.nextInt(); 此行只取一个整数,但不会完成整行。

因此,您可以在输入是或否之前通过添加sc.nextLine() 手动完成该行。通过添加额外的 nextLine() 将在您插入整数时完成当前行。

import java.util.Scanner;

class stak
    int tos=-1;
    int size;
    int a[];
    
    stak(int l)
        size=l;
        tos=-1;
        a=new int[l];
    
    void push(int x)
        if(tos==size-1)
            System.out.println("Stack Overflow");
        
        else
            a[++tos]=x;
        
    
    void pop()
        if(tos<0)
            System.out.println("Stack Underflow");
        
        else
            System.out.println(a[tos--]);
        
    
 
    void display()
        if(tos>=0)
            for(int i=tos;i>=0;--i)
                System.out.println(a[i]);
            
        
        else
        System.out.println("Stack is Empty");
    
 
 
 
 public class stack
    public static void main(String args[])
       Scanner sc=new Scanner(System.in);
       System.out.println("size of stack?");
       int n=sc.nextInt();
       stak s1=new stak(n);
       String z;
       do
       System.out.println("1.PUSH");
       System.out.println("2.POP");
       System.out.println("3.Display");
       int ch=sc.nextInt();
       switch(ch)
            case 1 : System.out.println("number for push?");
                    int p=sc.nextInt();
                    s1.push(p);
                    break;
                    case 2 : System.out.println("POP!");
                    s1.pop();
                    break;
                    case 3 : System.out.println("Display!");
                    s1.display();
                    break;
                    default: System.out.println(" OOPS! owner says only take input as: 1,2,3");
                    break;
       
      System.out.println("continue?");
      sc.nextLine();
      z=sc.nextLine(); 
    while(z.equals("yes")|| z.equals("y"));
    sc.close();
 
 

希望这会对您有所帮助。否则,您可以使用 BufferReader 解决此问题

【讨论】:

以上是关于输入在 do-while 循环中无法与 Scanner 类一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 do-while 循环中解决此分段错误?

std::cin 在 do-while 循环中不起作用

do-while与while的区别?

do-while循环判断成绩的有效输入

WHILE 和 DO-WHILE 循环未执行并卡在输出[关闭]

Do-While 循环,但 while 语句的值在 Do 语句内