将编码为字符数组的C样式字符串转换为Java字符串

时间:2012-10-23 09:40:23

标签: java c string terminator

我有一个C风格的字符串,编码为Java中的字符数组,但我想将此数组转换为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上测试过上面的代码。

3 个答案:

答案 0 :(得分:1)

此处无需涉及String。只需复制到一个比输入数组短一个char的新数组。用于此任务的方法是Arrays.copyOf

输出错误的原因是因为Java中的字符串与null终止符无关。您的第一行代码创建一个字符串,其最后一个字符是空字符。

对您更新的问题的回复

如果在null-char后面有垃圾,你可以使用new String(inputArray),然后找到带有String.indexOf('\0')的null-char,并在String.substring操作中使用它来删除不需要的部分。但是,从时间/空间复杂度的角度来看,只需迭代数组以找到null-char,然后将Arrays.copyOf与该索引一起用作截止点,就更简单了。

答案 1 :(得分:0)

您可以使用trim()删除空格字符:

System.out.println(Arrays.toString(toRet.trim().toCharArray()));

答案 2 :(得分: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());