Tutorial :Is it possible to write a Java printf statement that prints the statement itself?



Question:

Is it possible to have a Java printf statement, whose output is the statement itself?

Some snippet to illustrate:

// attempt #1  public class Main {  public static void main(String[] args) {    System.out.printf("something");    }  }  

This prints something.

So the output of attempt #1 is not quite exactly the printf statement in attempt #1. We can try something like this:

// attempt #2  public class Main {  public static void main(String[] args) {    System.out.printf("System.out.printf(\"something\");");    }  }  

And now the output is System.out.printf("something");

So now the output of attempt #2 matches the statement in output #1, but we're back to the problem we had before, since we need the output of attempt #2 to match the statement in attempt #2.

So is it possible to write a one-line printf statement that prints itself?


Solution:1

It's not pretty, but this is certainly possible:

public class Main {  public static void main(String[] args) {    System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");    }  }  

The output (as run on ideone.com) is:

System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");  

This output matches the printf statement.

There are likely to be shorter solutions.

See also


Solution:2

System.out is a static PrintStream instance which may be replaced with any PrintStream by inovking System.out.setOut(PrintStream s). So, just write a subclass of PrintStream and override the necessary methods. The following is just a very simple example for demonstration. It's advisable to override more methods.

    public class VerbosePrintStream extends PrintStream{            public VerbosePrintStream (PrintStream ps){              super(ps, true);          }            @Override          public void println(String x) {              super.println("System.out.println(\""+x + "\");");          }        }  

Now we test the above class:

VerbosePrintStream vps = new VerbosePrintStream(System.out);      System.setOut(vps);      System.out.println("test string");  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »