[英]C Remove leading and trailing spaces in string by pointer manipulation only
[英]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.