2017-10-07 10 views
0

私はJavaを学び始めていますが、書き込まれたバイト数を書き込むべき "%n"パラメータ(Cのprintf())を使用できるかどうかは疑問でした。 "%n" は、パラメータまで:JavaのCの書式指定子 "%n"

#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でそれを使用しようとすると:

これはCでの使用だある

私はこの問題を解決するにはどうすればよい

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

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

:210

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コンパイラは、私にこのメッセージを表示しますか?

+1

[Formatter documentation](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'の1つのメンバ配列で可能ですが、これはこの質問の対象外です。 – Oleg

0

Javaではまったく使用できません。そこの代わりにprintf C.の%nに対応する変換はあなたがsの文字数をチェックした文字列に

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

をフォーマットするString.formatを使用することができ、ではありません、別途フォーマット:

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

最後に、charの正確な同義語がbyteであるCとは異なり、Javaでは文字列がバイトでもUnicode/UTF-16コードポイントではないことに注意してください。文字列フォーマット操作によって書き込まれるバイト数を問い合わせることは無意味です。

関連する問題