【问题标题】:Check if a string is palindrome in C检查字符串是否是C中的回文
【发布时间】:2015-10-02 13:03:30
【问题描述】:

我有一个关于我正在为练习编写的代码的问题。我必须检查一个字符串是否是回文。我无法更改函数的声明。该函数仅在所有字母相同时返回 1(如“aaaa”),但如果我用其他回文(如“anna”)对句子充电,则函数返回 0 ,我不知道为什么会出现这种情况。谢谢!

char* cargar (char*);
int pali (char*);

int main()
{ 
   char*texto=NULL;
   texto=cargar(texto);
   int res=pali(texto);
   if(res==1){printf("\nPalindrome");}
   else printf("\nNot palindrome");

   return 0;
}

char* cargar (char*texto)
{
   char letra;
   int i=0;
   texto=malloc(sizeof(char));
   letra=getche();
   *(texto+i)=letra;
   while(letra!='\r'){
      i++;
      texto=realloc(texto,(i+1)*sizeof(char));
      letra=getche();
      *(texto+i)=letra;}
   *(texto+i)='\0';      
   return texto;
}

int pali (char* texto)
{
   int i;
   for(i=0;*(texto+i)!='\0';i++){
   }i--;
   if(i==0||i==1){return 1;}

   if(*texto==*(texto+i)){
      return pali(++texto);
   }
   else return 0;
}

【问题讨论】:

  • 你有什么问题?
  • 如果我输入 anna 之类的内容,函数返回 0,但 "anna" 是回文
  • 有很多资源展示了这个问题的算法。这是一个 c - programmingsimplified.com/c-program-find-palindrome
  • 我进行了搜索,但找不到任何使用唯一函数且递归的东西。此外,在不知道字符串长度的情况下
  • i--; 移动到if(i==0||i==1){return 1;} 之后。和*(texto+i) = 0;return pali(++texto); 之前插入。(这是一种破坏性算法。)

标签: c string recursion dynamic palindrome


【解决方案1】:

pali 函数测试字符串的第一个字符是否等于最后一个字符,然后调用自身获取字符串第二个字符的位置。但是请注意,它不会修改字符串的结尾,因此递归调用会再次将第二个字符与最后一个字符进行比较。然后将第三个字符与最后一个字符进行比较...如果 所有字符 都与最后一个字符相等,则最终pali 返回1,即如果所有字符都相等。

试试这个:

int pali (char* texto)
{
   char* end;
   for(end = texto; *end != '\0'; end ++)
       ;

   for(--end; texto < end; ++texto, --end) {
      if(* texto != * end)
          return 0;
   }
   return 1;
}

【讨论】:

    【解决方案2】:

    您确定字符串是否为回文的函数没有经过深思熟虑。

    假设您有一个长度为l 的字符串s。字符串中的字符排列为:

    Indices: 0    1    2    3            l-4  l-3  l-2  l-1
             +----+----+----+----+- ... -+----+----+----+----+
             |    |    |    |    |  ...  |    |    |    |    |   
             +----+----+----+----+- ... -+----+----+----+----+
    

    如果字符串是回文,

    s[0] = s[l-1]
    s[1] = s[l-2]
    
    ...
    

    当 LHS 的索引大于或等于 RHS的索引。

    要将其转化为代码,

    int is_palindrome(char const* s)
    {
       size_t len = strlen(s);
       if ( len == 0 ) // An empty string a palindrome
       {
          return 1;
       }
    
       size_t i = 0;
       size_t j = len-1;
       for ( ; i < j; ++i, --j )
       {
          if ( s[i] != s[j] )
          {
             // the string is not a palindrome.
             return 0;
          }
       }
    
       // If we don't return from inside the for loop,
       // the string is a palindrome.
       return 1;
    }
    

    【讨论】:

    • @this,我没听懂你的意思。
    【解决方案3】:

    马可试试这个。

    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    char* cargar (char*);
    int pali (char*);
    
    int main()
    {
    
    char*texto=NULL;
    
    texto=cargar(texto);
    
    int res=pali(texto);
    
    if(res==strlen(texto)){printf("\nPalindrome");}
    else printf("\nNot palindrome");
    
        return 0;
    }
    
    
    char* cargar (char*texto)
    {
    char letra;
    int i=0;
    texto=malloc(sizeof(char));
    letra=getche();
    *(texto+i)=letra;
    while(letra!='\r')
    {
        i++;
        texto=realloc(texto,(i+1)*sizeof(char));
        letra=getche();
        *(texto+i)=letra;
    }
    *(texto+i)='\0';      
    return texto;
    }
    
    int pali (char* a)
    {
    int flag=0,i;
    int len=strlen(a);
    for (i=0;i<len;i++) 
        {
        if(a[i]==a[len-i-1])
             flag=flag+1;
        }
        return flag;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 2012-04-05
      相关资源
      最近更新 更多