我有一个问题是str [newLength] =' \ 0'意思?因为我认为最后一个字符应该是str [newLength-1],所以我不知道这一行的含义。
编写一个方法,用'%20'替换字符串中的所有空格。假设字符串在字符串末尾有足够的空间来容纳其他字符,并且您给出了字符串的真实长度。我使用书籍代码,使用字符数组在Java中实现解决方案(鉴于Java字符串是不可变的):
public class Test {
public void replaseSpaces(char[] str, int length) {
int spaceCount = 0, newLength = 0, i = 0;
for(i = 0; i < length; i++) {
if (str[i] == ' ')
spaceCount++;
}
newLength = length + (spaceCount * 2);
str[newLength] = '\0';
for(i = length - 1; i >= 0; i--) {
if (str[i] == ' ') {
str[newLength - 1] = '0';
str[newLength - 2] = '2';
str[newLength - 3] = '%';
newLength = newLength - 3;
}
else {
str[newLength - 1] = str[i];
newLength = newLength - 1;
}
}
System.out.println(str);
}
答案 0 :(得分:15)
C编程语言的标准库通常使用NUL-terminated strings。 NUL终止的字符串存储在数组中,字符串本身由第一个'\0'
字符之前的数组中的所有字符组成(在ASCII中称为NUL)。例如,如果字符数组的元素是{'H','e','l','l','o','\0','i','d','1','0','t'}
,则字符串为"Hello"
,忽略NUL之后的所有内容。如果您将'\0'
写入NUL终止字符串的 n 位置,您将在第一个 n 字符后切断所有内容,这会将字符串的长度减少为no超过 n 。对str[newLength - 1]
等的写入在NUL之前写入字符。
我注意到你正在使用Java编程语言,并且你可能正试图将你的书中的C代码翻译成Java。与C不同,Java通常不使用NUL终止的字符串,除了JNI之类的高级内容,Java代码必须与C代码通信。与C不同,您通常不必修改现有的东西,而是可以自由地创建新的副本,因为Java具有自动垃圾收集功能,可以清除代码不再使用的对象和数组。
Java更经常使用StringBuilder
class来构造一个字符串,然后再创建一个不可变的String
。因此,惯用Java解决方案会在现有StringBuilder
,String
中为每个字符创建空append("%20")
,loop through the characters,作为空格或append
相同的字符否则,最后将StringBuilder
实例转换为String
。
答案 1 :(得分:5)
Java不是C也不是C ++; Java没有使用&#39; \ 0&#39;字符表示字符串的结尾(&#39;字符数组的结尾&#39;实际上在C和C ++中)。 Java保持一个长度&#39;数组的字段,因此它可以在幕后进行绑定检查。
答案 2 :(得分:0)
public class StringURLify {
public static void URLify(String s) {
char[] c = s.toCharArray();
int length = s.length();
int spaceCount = 0, newLength = 0;
for(int i=0;i<= c.length-1;i++) {
if(c[i] == ' ') {
spaceCount++;
}
}
newLength = length + (spaceCount * 2);
char[] c1 = new char[newLength];
for(int i=length-1;i>=0;i--) {
if(c[i] == ' ') {
c1[newLength - 1] = '0';
c1[newLength - 2] = '2';
c1[newLength - 3] = '%';
newLength = newLength-3;
} else {
c1[newLength-1] = c[i];
newLength = newLength-1;
}
}
System.out.println("URLified string : " + String.valueOf(c1));
}
public static void main(String[] args) {
URLify("the dog left");
}
}