#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的新手,所以请不要介意我是否发布了一些错误的方法)..
答案 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 == k
或j = 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