2011-07-03 15 views
1

爲什麼我得到一個公交車錯誤?有問題的行在代碼中被標記。C - K&R練習2.4 - 爲什麼我會遇到巴士錯誤?

練習2-4。 編寫squeeze(s1,s2)的替代版本,刪除s1中與字符串s2中任何字符匹配的每個字符。

#include <stdio.h> 

    /* 
    * Detects if a char is inside a string 
    */ 
    char in_string(char c, char s[]) { 
     int i = 0; 
     while (s[i] != '\0') { 
      if (s[i++] == c) 
       return 1; 
     } 
     return 0; 
    } 

    /* 
    * Returns the string s without any chars that are in map 
    */ 
    void squeeze(char s[], char map[]) { 
     int i, j; 

     for (i = j = 0; s[i] != '\0'; i++) { 
      if (! in_string(s[i], map)) { 
       s[j++] = s[i]; // <--- Bus Error 
      } 
     } 
     s[j] = '\0'; 

     printf("%s\n", s); 
    } 

    main() { 
     squeeze("XALOMR", "AO"); 
     squeeze("EWRTOG", "RGV"); 
    } 
+0

的問題是在標題中所述及的問題的行標裏面的代碼。不過,我試圖修復的格式有問題。 – CamelCamelCamel

回答

2

因爲"XALOMR"是一個字符串文字(這是隻讀),你不能修改它(因爲你在這裏做的:s[j++] = s[i];)周圍是

道:

main() { 
    char s1[] = "XALOMR"; 
    char s2[] = "EWRTOG"; 

    squeeze(s1, "AO"); 
    squeeze(s2, "RGV"); 
} 

這將在棧上創建一個字符數組。

0

字符串文字是隻讀的。當你試圖改變它時,你會得到一個錯誤。

0

如果您想修改它們,您需要創建這些變量。

char var1[20] = "XALOMR"; 
squeeze(var1, "AO"); 
1

當你試圖改變一個字符串,你可能得到一個錯誤。

真正發生的是您的代碼的行爲是未定義的。如果你幸運的話,你會得到一個錯誤。如果你不走運,代碼將按預期工作,這使得錯誤很難找到。

順便說一句,你可以聲明一個字符數組,從用於初始化字符串字面得到其大小:

char var1[] = "XALOMR"; /* sizeof var1 == 7 */