回文检查

时间:2014-03-23 15:44:57

标签: c

我获得了以下任务:

  

编写一个以字符串作为输入并打印时间最长的程序   字符串的前缀,其反向是字符串的有效后缀。   例如,如果给出“notation”作为输入,则前缀“no”是   最长的前缀,在该位置具有匹配的有效后缀(即“on”)   端。

     

如果字符串是回文(即如果字符串与其相同)   反转),然后前缀是整个字符串本身。例如,如果   输入是“思域”,那么最长的前缀本身就是“思域”。如果   string没有有效的前缀,打印0.例如,如果是输入字符串   是“鸟”,第一个角色本身就存在不匹配   没有有效的前缀。

     

字符串中的符号仅来自集合{A-Z,a-z}。该   符号区分大小写。即'A'和'a'被认为是   不同。您将获得一个名为printChars()的函数   从指向的起始位置打印一个字符数组   p到q指向的结束位置。如果p为NULL,则输出0。

     

该功能的原型是:

void printChars(char *p, char *q);
     

您不必为printChars()函数编写程序。这个   函数会自动添加到代码段的末尾   你写的。

     

如果您愿意,可以在库中使用字符串函数。

     

INPUT:输入是一个长度为N的字符串,仅由符号组成   设置{A-Za,z}。

     

OUTPUT:具有相应匹配后缀的最长前缀   如果不存在这样的前缀,则为0。

     

约束:输入将满足以下属性。它是   没有必要验证输入。

     

1·; = N< = 99

我已编写代码但编译失败。可能导致问题的原因是什么?如何解决?

#include<stdio.h>
#include<string.h>
void printChars(char *p,char *q);
int main()
{
    char a[99];
    int n;
    scanf("%s",a);
    char *p=null,*q=null,*x;
    p=&a[0];
    q=&a[0];
    n=strlen(a);
    x=&a[0]+(n-1);
    for(int i=0;i<=(n-1);i++)
    {
        if(*x==*q)
        {
            x--;
            q++;
        }
        else
        {
            q--;
            break;
        }
    }
    x=&a[0]+(n-1);
    if(*p!=*x)
        printf("0");
    printchars(p,q);
    return 0;
}

void printChars(char *p, char *q)
{
    if (p==NULL){
        printf("0");
    }
    else{
        while(p <= q){
            printf("%c",*p);
            p++;
        }
    }

仍然出错

Program:52:1: warning: data definition has no type or storage class [enabled by default]
Program:52:1: warning: type defaults to 'int' in declaration of 'printChars' [enabled by default]  
Program:52:1: warning: parameter names (without types) in function declaration [enabled by default]  
Program:52:1: error: conflicting types for 'printChars'  
Program:34:6: note: previous definition of 'printChars' was here  
Program:54:1: error: expected identifier or '(' before 'return'  
Program:56:1: error: expected identifier or '(' before '}' token  
Program:59:6: error: redefinition of 'printChars'  
Program:34:6: note: previous definition of 'printChars' was here

3 个答案:

答案 0 :(得分:2)

在C.中没有名为null的预定义宏 改变

char *p=null,*q=null,*x;

char *p = NULL, *q = NULL, *x;   

更改功能调用

 printchars(p,q);  
      ^ This 'c' should be in capital  

 printChars(p,q); 

你还错过了}函数的右括号printChars 然后最后运行代码:http://ideone.com/SczMu2

答案 1 :(得分:1)

试试此代码

  #include<stdio.h>
  #include<string.h>
 void printChars(char *p,char *q);//function prototype
  int main()
 {

  int i,n,k=0,j;
  char a[100];
  char b[100];
  char *p;
  char *q;
  printf("enter array of chars");
  scanf("%s",a);
  n=strlen(a);
  j=n;
  for(i=0;i<n;i++)
  {
       b[j-1]=a[i];

       j--;
  }
  for(i=0;i<n;i++)
  {
       if(a[i]==b[i])
       {k++;
       p=a;}
       //printf("%c",a[i]);
       else if(a[i]!=b[i]&&k==0){
       p=NULL;break;}
       else break;
    }
    //p=a;
     q=&a[k-1];



    printChars(p,q);
   return 0;
 }//end of main
  void printChars(char *p, char *q)
 {
   if (p==NULL){
 printf("0");
   }
   else{
   while(p <= q){
     printf("%c",*p);
   p++;
    }
   }
 }

答案 2 :(得分:0)

大约一年前,我接近了类似的任务。

看看这个功能。它返回从单词中打印的字符数。

int palindromeWordIndex(char *str)
{
    int indexLeft = 0, indexRight = strlen(str)-1;

    while (indexLeft <= indexRight)
    {
        if (str[indexLeft] == str[indexRight]){
            indexLeft++;
            indexRight--;
        }
        else
            return indexLeft;
    } 
    return strlen(str);
}

我从我自己的函数中重新编写了它,只检查一个单词是否是回文。

int isPalindromeIter(char *str){
int indexLeft = 0, indexRight = strlen(str)-1;

while (indexLeft <= indexRight){
    if (str[indexLeft] == str[indexRight]){
        indexLeft++;
        indexRight--;
    }
    else
        return 0;
}
return 1;

}