簡體   English   中英

str[newLength] = '\\0' 是什么意思?

[英]What does str[newLength] = '\0' mean?

我有一個問題,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);
}

C 編程語言的標准庫通常使用以NUL 結尾的字符串 以 NUL 結尾的字符串存儲在數組中,字符串本身由數組中第一個'\\0'字符(在 ASCII 中稱為 NUL)之前的所有字符組成。 例如,如果字符數組的元素為{'H','e','l','l','o','\\0','i','d','1','0','t'} ,字符串是"Hello" ,忽略 NUL 之后的所有內容。 如果您將'\\0'寫入以 NUL 結尾的字符串的位置n ,您將切斷前n 個字符之后的所有內容,從而將字符串的長度減少到不超過n 寫入str[newLength - 1]等會在 NUL 之前寫入字符。

我注意到您正在使用 Java 編程語言,並且您可能正在嘗試將書中的 C 代碼從字面上翻譯成 Java。 與 C 不同,Java 通常不使用以 NUL 結尾的字符串,除非在 JNI 等高級事物中,Java 代碼必須與 C 代碼對話。 同樣與 C 不同的是,您通常不必就地修改內容,而是可以自由地創建新副本,因為 Java 具有自動垃圾收集功能,可以清除代碼不再使用的對象和數組。

Java 更經常地使用StringBuilder來構造一個字符串,然后再從中生成一個不可變的String 因此,慣用的 Java 解決方案將創建一個空的StringBuilder遍歷現有String字符,為每個空格字符append("%20") ,否則append相同的字符,最后將StringBuilder實例轉換為String .

Java 既不是 C 也不是 C++; Java 不使用 '\\0' 字符來指示字符串的結束(實際上在 C 和 C++ 中為'字符數組結束')。 Java 為數組保留了一個“長度”字段,因此它可以在幕后進行邊界檢查。

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");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM