通过函数中的指针调用字符串(语法)

时间:2015-05-11 19:34:37

标签: c

我正在尝试编写一个检查字符串是否为回文的函数,但我认为在使用字符串指针时遇到一些错误。这段代码有什么问题?

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

2 个答案:

答案 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;中提出任何进一步的问题。 ;)