2014-04-12 3333 views
10

Bir dize girişi ve bir tamsayı girdisi almam gerekir, ancak önce burada bir tamsayı girişi olmalıdır, sonra kullanıcı dize girdisi için sorulmalıdırScanner.nextInt() ve Scanner.nextLine() birlikte kullanamazsınız

Scanner in = new Scanner(System.in); 


    input = in.nextLine(); 
    k = in.nextInt(); 

    in.close(); 

yukarıdaki kod çalışıyor ama aşağıdaki kodla

Scanner in = new Scanner(System.in); 

    k = in.nextInt(); 
    input = in.nextLine(); 


    in.close(); 

gibi ilk bir tamsayı girişi alırsak o zaman java.lang.ArrayIndexOutOfBoundsException atar.

import java.util.Scanner; 

public class StringSwap {

public static void main(String args[]) { 
    String input; 
    int k; 

    Scanner in = new Scanner(System.in); 

    k = in.nextInt(); 
    input = in.nextLine(); 


    in.close(); 

    int noOfCh = noOfSwapCharacters(input); 
    originalString(input, noOfCh, k); 

} 

public static int noOfSwapCharacters(String s) { 

    char cS[] = s.toCharArray(); 
    int i = 0, postCounter = 0; 
    while (cS[i] != '\0') { 
     if (cS[i] != '\0' && cS[i + 1] != '\0') { 

      cS[cS.length - 1 - postCounter] = '\0'; 

      postCounter++; 

     } 
     i++; 
    } 

    return postCounter; 

} 

public static void originalString(String s, int noOfCh, int k) {  
    int counter = 1, chCounter = 0; 
    char cArray[] = s.toCharArray(); 
    String post = ""; 
    String pre = ""; 
    String finalString = ""; 
    char temp; 

    for (int i = 1; i <= k; i++) { 
     chCounter = 0; 
     counter = 1; 
     post = ""; 
     pre = ""; 

     for (int j = 0; j < cArray.length; j++) { 

      if (counter % 2 == 0 && chCounter <= noOfCh) { 
       temp = cArray[j]; 
       post = temp + post; 
       cArray[j] = '\0'; 
       chCounter++; 

      } 
      counter++; 

     } 
     for (int h = 0; h < cArray.length; h++) { 

      if (cArray[h] != '\0') 
       pre = pre + cArray[h]; 

     } 

     finalString = pre + post; 
     for (int l = 0; l < finalString.length(); l++) { 
      cArray[l] = finalString.charAt(l); 

     } 

    } 

    System.out.println(finalString); 
} 

}

Lütfen burada yanlış ne yapıyorum işaret:

İşte benim kaynak dosyasının tam kod.

cevap

31

Sorun, tamsayılarınızı izleyen '\n' karakteridir. nextInt'u aradığınızda, tarayıcı int'u okur, ancak '\n' karakterini bundan sonra tüketmez; nextLine bunu yapar. Bu yüzden almayı umduğun dize yerine boş bir çizgi alıyorsun.

1 2 3 4 5 \n h e l l o \n 
^ 
:

12345 
hello 
İşte

giriş tampon başlangıçta böyle görünüyor (^Scanner sonraki veri parçasını okur hangi pozisyon gösterir):

senin girdi aşağıdaki verileri sahip olduğunu varsayalım

nextInt'dan sonra, arabellek şu şekilde görünür:

1 2 3 4 5 \n h e l l o \n 
      ^

ilk nextLine bu gibi tampon bırakarak \n tüketir:

1 2 3 4 5 \n h e l l o \n 
       ^

Şimdi nextLine çağrı beklenen sonucu üretecektir.

k = in.nextInt(); 
in.nextLine(); // Discard '\n' 
input = in.nextLine(); 
+0

o niye 'nextInt çağıran olacağını çok iyi bir açıklaması :) –

+1

oldu, çok teşekkür ederiz: Bu nedenle, programınızı düzeltmek için ihtiyacınız olan tek şey nextInt sonra nextLine için başka bir çağrı ekleyin ve onun sonucu atmak etmektir ', arabelleği 1'den 5'e taşıyın? 1'den 2'ye hareket edeceğini düşünürdüm. – Azurespot

+3

@NoniA. Çünkü arabellekte olan 'int' beş karakter uzunluğunda olur. – dasblinkenlight

İlgili konular