2010-04-13 111 views
6

我在StackOverflow上看到了很多問題,但是閱讀答案並沒有爲我清楚,可能是因爲我是C編程中的一個新手。這裏的代碼:返回一個指向char數組的指針C

#include <stdio.h> 

char* squeeze(char s[], char c); 

main() 
{ 
    printf("%s", squeeze("hello", 'o')); 
} 

char* squeeze(char s[], char c) 
{ 
    int i, j; 

    for(i = j = 0; s[i] != '\0'; i++) 
    if(s[i] != c) 
     s[j++] = s[i]; 
    s[j] = '\0'; 

    return s; 
} 

它編譯和我得到分段錯誤,當我運行它。我已經閱讀了this常見問題解答關於返回數組,並嘗試了那裏提供的'靜態'技術,但仍然無法使程序工作。任何人都可以指出它到底出了什麼問題,以後我應該注意什麼?

+2

你想做什麼? – 2010-04-13 02:10:54

+0

@snitko:'main()'的返回類型在哪裏? – 2010-04-13 02:15:42

回答

6

傳遞給擠壓函數的第一個參數是read-only字符串文字"hello",您正試圖修改它。

而是將它傳遞一個可修改的字符數組:

char str[] = "hello"; 
printf("%s", squeeze(str, 'o')); 
+1

人們也可以調用最小驚喜的原則來建議製作字符串的副本。如果我將char *傳遞給返回char *的函數,我可能不會指望它正在就地修改數組。 (API設計者在使用_const_時通常是sl sl不馴的。) – 2010-04-13 06:26:08

3

問題是常量字符數組"hello"可能無法通過它傳遞給它的函數進行正確修改。因此,只要確保你傳遞一個非常量數組(例如,通過建立一個本地陣列傳遞,只要結果是不需要squeeze的來電者外):

​​

你我希望這個常量只能傳遞給const參數(這樣編譯器本身可以告訴你你做錯了什麼),但是,唉,這不是C標準要求的東西(大概是出於向後兼容的原因與歷史代碼)。

+1

沒有什麼是暫時的,字符串存儲在「靜態」內存中。 – 2010-04-13 02:12:03

+0

好點(和我的措辭,讓我換句話)。 – 2010-04-13 02:13:45

3

這試圖修改不可修改的數據。

「hello」是一個常量字符串,存儲在某處的內存中。那麼你想要做的是改變它,而這通常是不允許的。我沒有看到你的意思是「靜態」,但你想要的東西會是這樣的...

int main() 
{ 
    char hello_str[16]; 
    strcpy(hello_str, "hello"); 
    printf("%s", squeeze(hello_str, 'o')); 
} 
相關問題