将以字符数组编码的C风格字符串转换为Java字符串

3

我有一个用字符数组编码的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运行。 我还没有在其他虚拟机上测试过上面的代码。

你可以看一下这个链接:http://stackoverflow.com/questions/1487023/how-should-i-terminate-a-char-array-before-converting-into-a-string-in-java - Alain BUFERNE
谢谢,那是一个有用的相关问题。 - Ben Braun
3个回答

1

这里不需要使用String。只需将其复制到一个比输入数组短一个字符的新数组中。用于此任务的方法是Arrays.copyOf

你的输出有问题的原因是Java中的字符串与空终止符无关。你的第一行代码创建了一个最后一个字符为null字符的字符串。

回答你更新后的问题

如果在null字符后面有垃圾,你可以使用new String(inputArray),然后使用String.indexOf('\0')找到null字符,并在String.substring操作中使用它来剪切掉不需要的部分。但是,从时间/空间复杂度的角度来看,仍然更简单的方法是遍历数组以定位null字符,然后使用该索引作为截断点使用Arrays.copyOf


修改问题以澄清。 - Ben Braun
好的,它需要几个步骤,但没关系。每当系统允许我时,我会将其标记为已接受的答案。 - Ben Braun

0
你可以使用 trim() 函数来去除空格字符:
System.out.println(Arrays.toString(toRet.trim().toCharArray()));

这个方法适用于以空终止字符结尾的字符串,但是当空终止字符后面有垃圾字符时就不行了,我想忽略它们。这个技巧很酷,我不知道 trim() 也会删除末尾的 \0。 - Ben Braun
trim()将空格定义为\u0000\u0020(包括)之间的字符,它不使用Unicode定义的空格,也不使用Character.isWhitespace - Ian Roberts

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());

这个不起作用。"\0".split("\0")[0]抛出IndexOutOfBoundsException异常。 - Ben Braun
确实,那么在这种情况下,结果字符串应该包含什么?为了避免再写一行代码:String string = dta[0] == '\0' ? "" : (new String(dta)).split("\0")[0]; - Udo Klimaschewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接