Java程序将空白字符串从打印延迟到控制台

时间:2015-04-19 14:14:52

标签: java string

这是我多次遇到的一个问题,总是想知道为什么。

以下我的代码为例,如果输入了一个空格字符串,则不会打印该方法。但是,在使用包含字符的值字符串进行下一次输入后,它将打印所有空白字符串和包含字符串的有效字符。为什么这会被延迟并存储在内存中?

以下代码示例: 输入“”不返回任何内容。 输入“”不返回任何内容。 输入“SwiggitySwooty”返回“”\ n“”\ n“SwiggitySwooty” 说明:包含字符串的空格被延迟,直到输入有效的字符串。

额外信息:我使用intellij,也就是在没有将字符串发送到方法时也会发生。我也曾经在一段时间(input.hasNext())语句中发生这种情况,当我想要取整数时,我尝试将无效输入作为字符串捕获。如果我输入'n'个合法的整数,然后是一个字符串,它会打印出我的“请输入一个整数”,这个数字在这段代码中就像这样。

最后,如果有人想到一个更好的标题,请告诉我,我可以更改它,以便为那些有类似问题的人提供更多曝光。谢谢。

如果你们还需要其他东西,请告诉我!

/**
 * Created by JacobHein on 4/19/15.
 */
import java.util.Scanner;
public class FizzString {
/*TODO
* Given a string str, if the string starts with "f" return "Fizz". 
If the string ends
* with "b" return "Buzz". If both the "f" and "b" conditions are true, return
* "FizzBuzz". In all other cases, return the string unchanged. */
public static void main(String[] args) {
  Scanner input=new Scanner(System.in);

  while(input.hasNext()) {
    System.out.println(fizzString(input.nextLine()));
  }
}
public static String fizzString(String str) {
  String result=str;
  int l=str.length();
  if (str.charAt(0)=='f'||str.charAt(l-1)=='b') {
    result="";
    if (l>0) {
      if (str.charAt(0)=='f') {
        result="Fizz";
      }
      if (str.charAt(0)=='b') {
        result="Buzz";
      }
      if (l>1) {
      /*technique: continue the process if l>1 (within l>0 if statement),
      prevents breaking the program.*/
        if (str.charAt(l-1)=='b') {
          result="Buzz";
        }
        if (str.charAt(0)=='f'&&str.charAt(l-1)=='b') {
          result="FizzBuzz";
        }
      }/*end l>1*/
    }/*end l>0*/
  }/*end charAt if*/
  return result;
 }
 }

2 个答案:

答案 0 :(得分:1)

我相信这是你正在寻找的:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    String inputLine = "";
    do {
        inputLine = input.nextLine();

        System.out.println(fizzString(inputLine));
        System.out.println("");
    } while (inputLine.length() > 0);

    System.out.println("Goodbye");
}

public static String fizzString(String str) {
    // Given a string
    // If both the "f" and "b" conditions are true, return FizzBuzz
    if (str.startsWith("f") && str.endsWith("b")) {
        return "FizzBuzz";
    }

    // If the string starts with "f" return "Fizz".
    if (str.startsWith("f")) {
        return "Fizz";
    }

    // If the string ends with "b" return "Buzz".
    if (str.endsWith("b")) {
        return "Buzz";
    }

    // In all other cases, return the string unchanged.
    return str;
}

结果:

enter image description here

答案 1 :(得分:0)

问题是Scanner类的行为:

The next and hasNext methods and their primitive-type companion methods
(such as nextInt and hasNextInt) first skip any input that matches the
delimiter pattern, and then attempt to return the next token. Both 
hasNext and next methods may block waiting for further input. Whether a 
hasNext method blocks has no connection to whether or not its 
associated next method will block.

在内部,Scanner类正在执行以下操作:

    while (!sourceClosed) {
        if (hasTokenInBuffer())
            return revertState(true);
        readInput();
    }

方法hasTokenInBuffer()会跳过所有分隔符标记(默认为\p{javaWhitespace}+),因此只有当类找到非分隔符标记时,它才会在hasNext()方法中返回true。

例如,如果您输入以下内容:" \ n \ n \ n5 \ n"然后执行nextInt()方法,您将获得5的结果,因为扫描程序会自动跳过所有返回行字符。

如果您想在一行中找到一些字符串,请尝试使用方法java.util.Scanner.findInLine而不是nextLine()

使用模式:^f(.)*查找以f字符开头的每一行和模式(.)*b$,以查找以b字符结尾的每一行