3

Javaで文字の配列としてエンコードされたCスタイルの文字列がありますが、この配列をJava文字列に変換したいと思います。一致するコンストラクター呼び出しを使用してみましたが、

String toRet = new String(new char[]{'B','A','D','\0', 'G', 'A', 'R', 'B', 'A', 'G', 'E'});
System.out.println(Arrays.toString(toRet.toCharArray()));

しかし、結果は正しくなく、実際には奇妙なことにバグがあります。上記のコードの出力は次のとおりです。

[B, A, D,

そして、これが私が欲しいものです

[B, A, D]

私はUbuntuのopenJdk6で実行しています。上記のコードを他のVMでテストしていません。

4

3 に答える 3

1

ここに文字列が関与する必要はありません。入力配列より1文字短い新しい配列にコピーするだけです。このタスクに使用する方法はArrays.copyOfです。

出力にバグがある理由は、Javaの文字列がヌルターミネータとは何の関係もないためです。コードの最初の行は、最後の文字がヌル文字である文字列を作成します。

更新された質問への回答

null-charの後にガベージがある場合は、を使用しnew String(inputArray)て、でnull-charを見つけ、それを操作String.indexOf('\0')で使用しString.substringて不要な部分を切り取ります。Arrays.copyOfただし、(時間/空間の複雑さの観点から)配列を反復処理してヌル文字を見つけ、そのインデックスをカットオフポイントとして使用する方が(時間/空間の複雑さの観点から)さらに簡単です。

于 2012-10-23T09:42:22.867 に答える
0

trim()スペース文字を削除するために使用できます。

System.out.println(Arrays.toString(toRet.trim().toCharArray()));
于 2012-10-23T09:50:49.127 に答える
0

コードを維持しなければならない人々を混乱させるために、次のように書くことができます。

char[] dta = new char[]{'B','A','D','\0', 'G', 'A', 'R', 'B', 'A', 'G', 'E'};

String string = (dta[0] == '\0') ? "" : (new String(dta)).split("\0")[0];
System.out.println(string.toCharArray());
于 2012-10-23T10:17:29.800 に答える