是否可以编写一个打印语句本身的Java printf语句?

时间:2010-05-22 04:52:08

标签: java printf quine

是否可以使用Java printf语句,其输出是语句本身?

一些片段来说明:

// attempt #1
public class Main {
public static void main(String[] args) {

System.out.printf("something");

}
}

这会打印something

因此,尝试#1的输出并不完全是尝试#1中的printf语句。我们可以尝试这样的事情:

// attempt #2
public class Main {
public static void main(String[] args) {

System.out.printf("System.out.printf(\"something\");");

}
}

现在输出为System.out.printf("something");

所以现在尝试#2的输出与输出#1中的语句匹配,但是我们回到了之前的问题,因为我们需要尝试#2的输出来匹配尝试#2中的语句。 / p>

那么可以编写一个打印自己的单行printf语句吗?

2 个答案:

答案 0 :(得分:6)

它不漂亮,但这肯定是可能的:

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);");

}
}

输出(as run on ideone.com)是:

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);");

此输出与printf语句匹配。

可能会有更短的解决方案。

另见

答案 1 :(得分:2)

System.out是一个静态PrintStream实例,可以通过inovking System.out.setOut(PrintStream s)替换为任何PrintStream。 因此,只需编写PrintStream的子类并覆盖必要的方法。 以下只是一个非常简单的演示示例。建议覆盖更多方法。

    public class VerbosePrintStream extends PrintStream{

        public VerbosePrintStream (PrintStream ps){
            super(ps, true);
        }

        @Override
        public void println(String x) {
            super.println("System.out.println(\""+x + "\");");
        }

    }

现在我们测试上面的类:

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