分割失败(核心转储),C

问题描述:

我有以下程序:分割失败(核心转储),C

#include <stdio.h> 
#include <stdbool.h> 

#define MAX 100 
//a) 
bool isPalyndrom(char c[], int cnt) { 
    int i; 
    char pal[MAX]; 
    int j = 0; 
    for (i = cnt - 1; i >= 0; i++) { 
     pal[j] = c[i]; 
     j++; 
    } 
    for (i = 0; i < cnt; i++) { 
     if (c[i] != pal[i]) return false; 
    } 
    return true; 
} 

int main() { 
    char c, s[MAX]; 
    int i = 0; 
    int cnt = 0; 
    do { 
     c = getchar(); 
     s[i] = c; 
     i++; 
     cnt++; 
     printf("\n%s\n", s); 
    } while (c != '\n'); 
    printf("%d", cnt); 
    bool istrue = isPalyndrom(s, cnt); 
    if (istrue) { 
     printf("\n%s Pal.\n", s); 
    } else { 
     printf("\n%s not Pal.\n", s); 
    } 
    return 0; 
} 

然而,当我运行它,显示:段错误,问题是在do-while循环,程序停止,在我的char c被写入数组之后,在do-while循环被留下之前。有人可以看看do-while循环吗?

+0

的问题是在'isPalindrome()'函数。仔细检查该函数下循环中的索引。 – Kishore

+0

除了其他评论,s char数组未被初始化。所以,它可能不是null终止,并且do-while循环中的printf将成为问题。做一个memset到零,它应该会更好。 – bruceg

+0

真的是细分“失败”吗? –

有一个在这个循环中的错字

int j=0; 
for(i=cnt-1; i>=0; i++){ 
        ^^^^ 
pal[j]=c[i]; 
j++; 
} 

我想你的意思i--

你也没那么使用例如 此语句terminatinbg零分配到阵列s

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

在此do-while循环中

do{ 
c=getchar(); 
s[i]=c; 
i++; 
cnt++; 
printf("\n%s\n",s); 
}while(c!='\n'); 

是错误的。

除了你在数组s中包含新的行字符。

考虑到可以在不使用辅助数组的情况下简化函数。例如

bool isPalyndrom(const char s[], size_t n) 
{ 
    size_t i = 0; 

    while (i < n/2 && s[i] == s[n-i-1]) ++i; 

    return i == n/2; 
} 
+1

,在'printf'函数中,我认为他的意思是符号'\ n',而不是'n'。 (实际上这就是为什么do-while循环不起作用) – FalconUA

+0

@FalconUA你在说什么? –

有一些错误很明显。在任何情况下,解决方案可以是:

#include <stdio.h> 
#include<stdbool.h> 

#define MAX 100 

bool isPalyndrom(char c[]) { 
    int strLen = strlen(c); 
    for (int i = 0; i < strLen/2; i++){ 
     if (c[i] != c[strLen - i - 1]) { 
      return false; 
     } 
    } 
    return true; 
} 

int main() { 
    char c, s[MAX]; 
    int i = 0; 
    while ((c = getchar()) != '\n') { 
     s[i++] = c; 
    } 
    s[i] = '\0'; 
    printf("%d", strlen(s)); 
    bool istrue = isPalyndrom(s); 
    if (istrue){ 
     printf("\n%s Pal.\n", s); 
    } else { 
     printf("\n%s not Pal.\n", s); 
    } 
    return 0; 
}