2017-06-13 94 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; 
}