2017-06-13 93 views
-5

我正在嘗試編寫一個檢查迴文的程序。 但不知何故,我得到了一個分段錯誤。 這個程序:c中的分段錯誤

#include <stdio.h> 

int palindrome(char *beginning); //functions declaration 

int main() 
{ 
    char str[255],c; //variables 
    int i=0; 

    printf("please enter a string: "); //message to user 
    fgets(str,255,stdin); 
    palindrome(str[255]); 

    return 0; 
} 

int palindrome(char *beginning) //functions to chack palindrome 
{ 

    char *end = beginning + strlen(beginning) -1; 

    if (end - beginning <= 0) 
     return 1; 

    if (!isalpha(*beginning)) 
     palindrome(beginning+1); 

    if (!isalpha(*end)) 
     { 
      *end = '\0'; 
      palindrome(beginning); 
     }   

    if (*beginning == *end) 
     { 
      *end = '\0'; 
      return palindrome(beginning+1); 
     } 
    return 0; 

} 
+0

檢查你的編譯器警告。 '迴文(str [255])'是錯誤的。該函數需要'char *',但'str [255]'是一個'char',並且還可以訪問數組。 – Barmar

+0

當您嘗試編譯時,您的編譯器是否告訴您任何感興趣的東西?如果是的話,*它說了什麼?如果沒有,請獲得符合標準的編譯器。 – EOF

回答

0

char str[255]持有255個值。用palindrome(str[255]);您試圖傳遞不存在的str的第256個(!)值。

更重要的是,palindrome接受char *指針char,但你傳遞一個char,which'll導致很多其他錯誤。您可能正在尋找 &str[254] 或正如評論中指出的那樣,更可能的是palindrome(str)

+0

他只是在尋找'palindrom(str);' – Barmar

0

你的代碼有幾個錯誤。首先,如果你想將char []數組傳遞給一個函數,只需要傳遞數組名稱本身,即(function(array));通過array[index]正在傳遞您包含的特定索引處的值。由於您提到的索引255實際上超出了數組的範圍,因此您正在訪問的數值甚至不在數組中 - 即使您正在調用接受單個char作爲參數的函數,這也是錯誤的。

我不會實施palindrome遞歸,除非它是您的任務/課程作業的具體要求。從技術上講,這是所有你需要一個迴文測試(你可以省略該參數len並調用strlen在你的函數來確定的長度,如果你願意的話):

int ispalindrome(char *str, int len) 
{ 
    char *p = &str[0]; 
    char *q = &str[len - 1]; 
    do 
    { 
     if(p >= q) 
     { 
      return 1; 
     } 
    } 
    while (*p++ == *q--); 
    return 0; 
}