簡體   English   中英

刪除C中的尾隨空格

[英]Remove Trailing Spaces in C

我正在嘗試刪除尾隨空格,但是我一直遇到分段錯誤。 不太確定我在哪里訪問內存,但這是我的代碼。 前導空間工作正常。

字符串是函數的輸入。

//remove leading spaces
char* final = string;
while(isspace((unsigned char)final[0]))
        final++;

 //removing trailing spaces
//getting segmentation fault here
    int length = strlen(final);
    while(length > 0 && isspace((unsigned char)final[length-1]))
            length--;
    final[length-1] = '\0';

我測試的字符串是

char* word = "  1 2 Hello    ";
printf("%s\n", removeSpaces(word));

當我注釋掉尾隨空格時,它可以完美工作。 我不明白為什么代碼在尾部空格處失敗。 我非常感謝您的幫助。

字符串文字" 1 2 Hello "存儲在只讀存儲器中。 在嘗試向其中寫入“ \\ 0”之前,先將其復制,然后該問題將消失。 因此,例如,只需替換為:

char* final = string;

有了這個:

char* final = strdup(string);

編輯1:更詳細地考慮這一點后,我意識到您還可以在進行尾部修剪之前先進行修剪。 由於您正在移動指針,因此需要在前導修剪之后進行分配,否則調用者將無法釋放內存。 這是一個完整的解決方案,應該沒有任何錯誤:

char *removeSpaces(const char *string) {

    while(isspace((unsigned char)string[0]))
        string++;
    char *final = strdup(string);
    int length = strlen(final);
    while(length > 0 && isspace((unsigned char)final[length-1]))
        length--;
    final[length-1] = '\0';
    return final;
}

編輯2:雖然在這種情況下我不建議這樣做,但要知道,如果變量是這樣聲明的,則可能會很有用:

char word[] = "  1 2 Hello    ";

它應該在可寫內存中,並且該問題也將不存在。 感謝pmg的想法。

之所以不好,是因為您希望函數的調用者始終提供可寫的字符串,並且您將對其進行修改。 通常,返回重復項的函數是一種更好的方法。

(不要忘了以后釋放()結果!)

暫無
暫無

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

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