2014-10-25 2 views
3

У меня вопрос, что означает str [newLength] = '\ 0? потому что я думаю, что последний символ должен быть str [newLength-1], поэтому я не знаю смысла этой строки.Что означает str [newLength] = ' 0?

Напишите способ замены всех пробелов в строке на «% 20». Предположим, что строка имеет достаточное пространство в конце строки для хранения дополнительных символов и что вам задана истинная длина строки. Я использовал код книги, внедрение решения в Java с использованием массива символов (учитывая тот факт, что Java Strings неизменны):

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

Не делайте этого ... Вы должны использовать 'UrlEncoder' для [кодирования строки для URL-адреса] (http://stackoverflow.com/questions/10786042/java-url-encoding). –

+0

Не UrlEncoder конвертирует пространство в плюс? – Marichyasana

+0

Этот оператор будет хранить символ «null» в массиве 'str', в элементе, индексированном' newLength'. Это фактически завершает нуль строку C-стиля, содержащуюся в массиве 'str'. То, что это означает, зависит от человека, который написал код - это не стандартная идиома Java. –

ответ

3

Java не является C, ни C++; Java не использует символ «\ 0», чтобы указать конец строки («конец массива символов» на самом деле в C и C++). Java хранит поле «длина» для массивов, поэтому оно может выполнять привязку к проверке за кулисами.

12

Стандартная библиотека языка программирования C обычно использует NUL-terminated strings. Строка с нулевым символом сохраняется в массиве, а сама строка состоит из всех символов в массиве до первого символа '\0' (называемого NUL в ASCII). Например, если элементы массива символов равны {'H','e','l','l','o','\0','i','d','1','0','t'}, строка равна "Hello", причем все после игнорирования NUL. Если вы пишете '\0' в положение п в виде NUL-строку, оканчивающуюся, вы отрезали все после первых п символов, что уменьшает длину строки не более чем п. Запись в str[newLength - 1] и т.п. записывает символы непосредственно перед NUL.

Я замечаю, что вы используете язык программирования Java, и вы, вероятно, пытаетесь перевести код C из своей книги буквально на Java. В отличие от C, Java обычно не использует строки с нулевым завершением, за исключением расширенных таких вещей, как JNI, где Java-код должен разговаривать с кодом C. Кроме того, в отличие от C, вам обычно не нужно изменять какие-либо вещи, но вместо этого можно свободно создавать новые копии, так как Java имеет автоматическую сборку мусора, чтобы избавиться от объектов и массивов, которые ваш код больше не использует.

Java более часто использует StringBuilder class для построения строки перед тем, как сделать неизменным String. Так идиоматическое решение Java создаст пустой StringBuilder, loop through the characters в существующем String, append("%20") для каждого символа, пробел или append тот же символ в противном случае, и, наконец, преобразовать экземпляр StringBuilder в String.

+6

+1 для шутки, скрытой после null :) –

Смежные вопросы