我在理解如何使用Java中的String
或char[]
来编写下面的代码时遇到了一些困难。
void xyz(char *a, int startIndex, int endIndex)
{
int j;
for (j = startIndex; j <= endIndex; j++)
{
doThis((a+startIndex), (a+j));
xyz(a, startIndex+1, endIndex);
}
}
此处char *a
指向char name[]
上面只是一些随机函数,但我只想要在Java中使用char*
和字符索引char[]
的逻辑
答案 0 :(得分:3)
正如您所指出的,C中的char *指向字符数组的开头(这是C管理字符串的方式)。
在C中,char的大小是一个字节,指针总是指向一个字节的开头。你的C字符串是一个字符数组,所以在指针上添加1可以将字符串的开头向右移动一个字符。
这意味着C代码:
char *a;
// Set the String here
a = a + 1;
在Java中翻译为:
String a;
// Set the String here
a = a.substring(1);
或者如果您使用的是char数组:
char[] a;
// Set the array contents here
char[] copyTo = new char[a.length];
System.arraycopy(a, 1, copyTo, 0, a.length);
a = copyTo;
Java会更加谨慎地保护C,但是。例如,如果你有一个零长度的字符串,C代码有可能是段错误(崩溃应用程序)或者给你一个充满内存垃圾的乱码(然后,最终崩溃应用程序),而Java代码将抛出一个异常(通常是一个IndexOutOfBoundsException),你可以希望它可以干净利落地处理。
请记住,Java中的String是不可变的。你不能改变它们,你只能创建新的字符串。幸运的是,String有几个内置函数,允许您执行许多标准操作,例如将String的一部分替换为另一个并返回结果。字符数组 是可变的,您可以更改其中的字符,但是使用正确的String类会损失很多好处。
答案 1 :(得分:3)
基于评论主题的重新提问:
您无法更改Java String
的字符。如果您需要修改字符序列,请使用支持setCharAt(int, char)
,insert(int, char)
和append(char)
的{{3}}。您可以使用new StringBuilder(myString)
将String
转换为StringBuilder
,将stringBuilder.toString()
转换回来。
这是完全合法的Java代码 - 它不是代码臭,它只是你使用可变字符序列的方式。
答案 2 :(得分:0)
你无法做到这一点。 Java仅供参考。您无权访问内存位置信息,因此无法对其进行算术运算。
看起来你正在传递一个字符串进行操作。您有几种方法可以模拟它。
还有一个黑客可以用来绕过传递的传递,但除了在特殊情况下它的风格很差。传入一个你需要修改的数组,所以在这种情况下,一个字符数组数组将允许你设置一个新的子数组,并有效地通过引用传递,但尽量不要这样做:)
答案 3 :(得分:0)
如果你的方法修改了你不能使用String的值,因为它是不可变的,你可以使用StringBuilder代替。
如果您的方法已经依赖于char数组并且您需要偏移量,则可以使用CharBuffer来包装数组。它不支持String操作,但支持子范围的视图,这似乎是您在doThis()
方法中使用的视图。