无法理解这个程序逻辑

时间:2015-01-15 07:02:05

标签: c

#include <stdio.h>    
void palind(char s[]){    
  int i,strlen=0,j,k;   
  for(i=0;s[i]!='\0';i++)    
    strlen=i;    
  for(j=0,(k=(strlen-1));j<=k;j++,k--){   
    if(s[i]!=s[j])   
        break;   
  }   
  if((k-j)>1)   
    printf("not a palindrome");    
  else if(k==j||(k-j)==1)        
    printf("yeah a palindrome");        
}        
int main(){           
  char line[100];            
  printf("enter the string: ");          
  scanf("%s\n",&line);            
  palind(line);            
}         

嘿我很难理解palind()函数的逻辑,就像在for循环strlen的第一次迭代中那样是0所以k=-1 n然后是j<=k

请帮帮我 (我是stackoverflow的新手,所以请不要介意我是否发布了一些错误的方法)..

3 个答案:

答案 0 :(得分:3)

回答有关第一个for循环的具体问题。代码:

for (i = 0; s[i] != '\0'; i++)
    strlen = i;

计算字符串的长度。 strlen在此循环之前设置为0,因为它可能是一个空字符串。

所以第二个循环:

for (j = 0, (k = (strlen - 1)); j <= k; j++, k--) {
    if (s[k] != s[j])
        break;
}

可以解释为将j设置为字符串的开头,将k设置为字符串的结尾,直到它们交叉,增加j并递减k,当两个位置保持不同的字符时断开。

希望有所帮助。这是非常糟糕的代码,所以如果你想学习C,那么我建议你找一些质量更好的东西来看看!

答案 1 :(得分:1)

以下for循环不正确。

for(j=0,(k=(strlen-1));j<=k;j++,k--){   
  if(s[i]!=s[j])   
     break;   
}

应该是:

for(j=0,(k=(strlen-1));j<=k;j++,k--){   
  if(s[k]!=s[j])
    // ^^ k, not i   
     break;   
}

循环开始时s[j]是第一个字符,s[k]是最后一个字符。如果它们相等,则j递增,k递减。否则,你就会脱离循环。当你突破循环时,如果是j+1 == kj = k+1,那么该单词就是一个回文。否则,它不是回文。

答案 2 :(得分:0)

循环1 -

for(i=0;s[i]!='\0';i++)    
    strlen=i; 

循环2 -

for(j=0,(k=(strlen-1));j<=k;j++,k--){   
    if(s[i]!=s[j])   
       break;
    }

循环2未嵌套在循环1中。循环1首先计算strlen,因此对于第一次迭代k将不是-1