分段失败(核心已转储),C

Segmentation failed (core dumped), 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;
}

但是,当我运行它时,显示:segmentation fault,问题出在do-while循环中,程序停止,在我的char c写入数组之后和do-之前剩下 while 循环。有人可以看看 do-while 循环吗?

这个循环有错别字

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;
}

有些错误很明显。无论如何,解决方案可能是:

#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] = '[=10=]';
    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;
}