分割失败(核心转储),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循环吗?
答
有一个在这个循环中的错字
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;
}
的问题是在'isPalindrome()'函数。仔细检查该函数下循环中的索引。 – Kishore
除了其他评论,s char数组未被初始化。所以,它可能不是null终止,并且do-while循环中的printf将成为问题。做一个memset到零,它应该会更好。 – bruceg
真的是细分“失败”吗? –