2015-01-15 3 views
-2
#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(), как и в первой итерации для цикла strlen является 0, так k=-1 п, то j<=k?не может понять эту программу логики

пожалуйста, помогите мне
(и я новичок в StackOverflow поэтому, пожалуйста, не возражаете, если я отправил это какой-то неправильный путь) ..

+0

Я должен признать, что это написанный на заказ код для понимания человеком. –

ответ

3

Чтобы ответить на конкретные вопросы о первом для цикла. Код:

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 до начала строки, к до конца строки, и, пока они не пересекаются, приращение J и декремента к, нарушая когда две позиции имеют разные персонажи.

Надеюсь, что это поможет. Это ужасно плохо написанный код, поэтому, если вы пытаетесь изучить C, я предлагаю вам найти что-то лучшего качества, чтобы посмотреть!

+0

IMO <скорее OP запутался в цикле _second_ 'for'. –

+0

Да, вот почему я объясняю оба. – sprinter

+0

Мой первый комментарий - 6 минут старше. Ничего, теперь ответ хорошо. –

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 == k или j = k+1. В противном случае это не палиндром.

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

Смежные вопросы