2017-10-07 189 views
0

所以我开始学习java,我想知道是否可以使用“%n”参数(来自C printf()),它应该写入写入的字节数到 “%N” 参数:Java中的C格式说明符“%n”

这是它在C用途:

#include <stdio.h> 

int main() 
{ 
    int val; 

    printf("ciao %n ciao\n", &val); 

    printf("val = %d\n", val); 

    return 0; 

} 

打印:

ciao ciao 
val = 5 

但是当我尝试在Java中使用它:

public class CharTest 
{ 
    public static void main(String[] argv) 
    {  
     int value; 

     System.out.printf("\nNumber of bytes written up to now: %n\n", &value); 
     System.out.println(value); 
    } 
} 

Java编译器给了我这个消息:

CharTest.java:20: error: illegal start of expression 

System.out.printf("\nNumber of bytes written up to now: %n\n", &value); 
                  ^
1 error 

如何解决这个问题?

+1

[格式器文档](https://docs.oracle.com/javase/9​​/docs/api/java/util/Formatter.html#summary)将回答你的问题。 – VGR

+0

它确实不应该在C中,因为它是如此简单的攻击矢量。 – djechlin

回答

1

在C中,您可以通过引用传递参数或通过传递指向它们的指针来更改传递给函数的变量的值,%n说明符存储目前为止写入的字符数value,为了做到这一点,您必须通过指针value&value

在Java中,不可能通过引用传递参数或传递变量指针,并且相同的语法是不可能的,&运算符是按位和。 Java中的printf%n说明符打印平台特定的行分隔符。

+0

@AnttiHaapala它可能与'int'的一个成员数组,但我认为这超出了这个问题的范围。 – Oleg

0

你根本无法用Java来完成它。没有转换,将对应于printf C的%n相反,你可以使用String.format格式化字符串

String s = String.format("\nNumber of *%s* written up to now: ", "characters"); 

然后检查s的字符数,和格式分开:

int len = s.length() 
String result = String.format("%s%d\n", s, len); 

最后,请注意,与C中不同,charbyte的确切同义,在Java中,字符串甚至不包含字节,而是由Unicode/UTF-16码点组成。询问字符串格式化操作写入的字节数是没有意义的。