2017-10-07 185 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碼點組成。詢問字符串格式化操作寫入的字節數是沒有意義的。