2013-01-23 34 views
0

這是我嘗試刪除一個字符串的重複,我有兩個問題:刪除字符串中的重複項。我錯過了什麼?

void removeDuplicates(char *original_string) 
{ 
    if(original_string == NULL) { 
     return; 
    } 
    int len = strlen(original_string); 
    if (len < 2) { 
     return; 
    } 

    int tail = 1; 
    int i; 
    for (i = 1; i < len; i++) { 
     int j; 
     for (j=0; j < tail; j++) { 
      if (original_string[i] == original_string[j]) { 
       break; 
      } 
     } 
     if (j == tail) { 
      original_string[tail] = original_string[i]; 
      ++tail; 
     } 
    } 
} 

第一:我在做什麼錯了,我沒有看到?我在一本書中找到了這個例子,我相信這很有道理。爲什麼重複的字符不被刪除?

二:當調用函數,如果我這樣做:

char duplicated[] = "aba"; 
removeDuplicates(duplicated); 

我沒有得到一個錯誤。但是,如果我這樣做:

char *duplicated = "aba"; 
removeDuplicates(duplicated); 

我在運行時得到一個Bus error: 10

+1

可能重複(HTTP:/ /stackoverflow.com/questions/164194/why-do-i-get-a-segmentation-fault-when-writing-to-a-string) –

+0

我的問題不只是關於錯誤,但爲什麼該功能不起作用。 –

+0

我在你的問題中沒有看到任何這樣的提及。你說'當我做第一個時,我沒有得到錯誤,而第二個錯誤。你沒有說過它是否有效。你希望我們編譯和驗證功能嗎? –

回答

1

"..."創建一個常量大塊的內存保存您的字符串。
你不能修改它。

因此,在常量字符串上調用時,修改original_string[tail]是未定義的行爲。

+0

'original_string [tail]'本身不是未定義的行爲。否則,你不能以任何(有用的)方式使用字符串文字:) – 2013-01-23 19:16:31

+0

感謝您的問題。其實我的問題也包括爲什麼我的方法不工作在刪除重複的字符。我看不見發生了什麼。 –

4
char duplicated[] = "aba"; 

創建陣列的char小號,這是可寫的。

char *duplicated = "aba"; 

創建一個字符串(這是不可修改的),那麼變量duplicated分配給指針,該字符串文字。由於你的函數試圖在原地修改字符串,因此當試圖寫入字符串文字時會調用未定義的行爲,從而導致崩潰。

+0

但即使將其聲明爲char duplicated [] =「aba」;我沒有看到重複的字符被刪除。函數內部的錯誤在哪裏? –

+0

@HommerSmith現在,這是另一個問題。你嘗試過調試嗎?另外,你期望'original_string [i];'做什麼?它本身沒有任何作用。這是一個沒有副作用的表達式語句,其價值立即被丟棄 - 實質上是沒有操作的。 – 2013-01-23 19:18:36

+0

這是在我原來的問題...我問兩個問題,第一個爲什麼不工作,第二個,爲什麼當我聲明字符串本身時得到這個錯誤... –

1

字符串文字是不可修改的在C.它是未定義的行爲

所以,duplicated必須是一個本地陣列:

或它必須是

char duplicated[] = "aba"; 

和不

char *duplicated = "aba"; 
0

什麼都沒有被刪除

original_string [尾巴] = original_string [I]

未刪除任何東西,它取代

[爲什麼我得到一個分段錯誤寫入字符串時?]的
相關問題