【问题标题】:Segmentation failed (core dumped), C分段失败(核心转储),C
【发布时间】:2015-12-09 22:14:22
【问题描述】:

我有以下程序:

#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 循环吗?

【问题讨论】:

  • 问题出在isPalindrome() 函数中。仔细检查该函数下循环中的索引。
  • 除了其他cmets,s char数组没有初始化。因此,它可能不会以空值终止,并且 do-while 循环中的 printf 将是一个问题。在 s 上做一个 memset 到零,应该会更好。
  • 真的分割“失败”了吗?
  • 是的,但是已经解决了,我写了这个:c=getchar();而(c!='\n'){ s[i]=c;我++; cnt++; c=getchar(); } 加上纠正了我错误写的可笑的 i++

标签: c arrays string getchar


【解决方案1】:

这个循环有错别字

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

我想你的意思是i--

您也没有将终止零分配给数组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;
}

【讨论】:

  • 另外,在printf 函数中,我认为他的意思是符号\n,而不是n。 (实际上这就是 do-while 循环不起作用的原因)
  • @FalconUA 你说的是哪里?
【解决方案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] = '\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;
}

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2017-02-25
    • 2016-07-12
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多