添加大括号以避免其他晃

添加大括号以避免其他晃

bool isPalindromeIterative(const char *s1){

int len=strlen(s1)-1;

if(len>0)
    if(s1[0]==s1[len]){
        len-=2;
        isPalindromeIterative(s1+1);
    }
    else

        return false;

return true;
}


我在写关于回文报。
当我运行它时,它会显示如下警告:

“ :: 79:13:警告:添加大括号以避免其他晃来晃去
      [-Wangling-else]”

请帮我 !谢谢!

最佳答案

当你写的时候

if(len>0)
    if(s1[0]==s1[len]){

        // This has no effect on the recursive call.
        len-=2;

        // You missed the return in your post.
        return isPalindromeIterative(s1+1);
    }
    else
        return false;


您最有可能打算将else与第二个if关联。

if(len>0)
{
    if(s1[0]==s1[len])
    {
        return isPalindromeIterative(s1+1);
    }
    else
        return false;
}


但是,编译器不使用缩进来解决这一问题。从编译器作者的角度来看,您可能要将else与第一个if关联:

if(len>0)
{
    if(s1[0]==s1[len])
    {
        return isPalindromeIterative(s1+1);
    }
}
else
{
   return false;
}


由于这是开发人员经常犯的错误,因此编译器会警告您,并希望您更新代码,以免它变成运行时错误。



我想指出的是,用于检测字符串是否为回文的递归逻辑是错误的。

假设您的字符串是“ abxba”。

在第一次迭代中,将'a''a'进行比较。
在下一次迭代中,将'b''a'进行比较,这是不正确的。您最终得到错误的答案。

您必须稍微改变策略。使用:

bool isPalindromeIterative(const char *s1, int start, int end)
{
   if ( start >= end )
   {
      return true;
   }

   if ( s1[start] == s1[end] )
   {
      return isPalindromeIterative(s1, start+1, end-1)
   }

   return false;
}


迭代调用的开始必须为:

isPalindromeIterative(s1, 0, strlen(s1)-1);

关于c++ - C++“添加大括号以避免其他晃动”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49307977/

10-11 21:53