我正在尝试编写一个检查字符串是否为回文的函数,但我认为在使用字符串指针时遇到一些错误。这段代码有什么问题?
#include<stdio.h>
#include<string.h>
#define MAX 1000
int IsPalindrome(char *);
void main(){
int i;
char *string[MAX], *string2[MAX];
gets(string);
for(; *string!=NULL; ++string){
toupper(string);
if(isspace(string)==1 || isalnum(string)==0 )
for(string2=string; *(string2 +1)!=NULL ;++string2)
*string2=*(string2 +1);
if(IsPalindrome(*string)==1)
printf("YES");
else
printf("NO");
return 0;
}
int IsPalindrome(char *string){
size_t p;
static int i;
p=strlen(string) -1;
if( *string!= *(string+p-i))
return 0;
if(string>=string +p -i)
return 1;
else{
++i;
return IsPalindrome( *(string+1)) ;
}
}
答案 0 :(得分:0)
你的代码被写成好像sting类型是char *所以你应该转
char *string[MAX], *string2[MAX];
进入
char buffer[MAX] ;
char *string = buffer ;
char buffer2[MAX];
char *string2 = buffer2 ;
答案 1 :(得分:0)
正如@marom在答案中提到的那样,您将char[]
完全视为char*
并且它不正确。
在这里,您可以看到正确的代码版本。我试图在评论中描述它。
#include<stdio.h>
#include<string.h>
#define MAX 1000
int IsPalindrome(char *);
int main(){
char string[MAX];
char *p=string; // points to last valid index
int i, len;
gets(string);
len = strlen(string);
for(i=0; i<len; i++)
{
if( isalnum(string[i])!=0)
{
// we keep just alphabet(in uppercase) and digits
*p = toupper(string[i]);
p++;
}
}
*p=NULL; // terminate end of string
//////////////////////////////////////////////////////////////////////////
if(IsPalindrome(string)==1)
printf("YES");
else
printf("NO");
return 0;
}
int IsPalindrome(char *string){
int len=strlen(string);
if(len<=1)
return 1;
if( string[0] != string[len-1])
return 0;
//////////////////////////////////////////////////////////////////////////
// we need to remove one letter from both side
string[len-1]='\0'; // remove one letter from end
//Notice we do above line as It's allowed to change the origin string
return IsPalindrome(&string[1]) ; // send 2nd letter as start point
}
在答案的评论部分或&#34; Piazza&#34;中提出任何进一步的问题。 ;)