分段失败(核心已转储),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;
}
我有以下程序:
#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;
}