回文C程序混淆

回文C程序混淆,c,string,palindrome,C,String,Palindrome,我正在探索如何使用字符串,我对这个特殊的程序有一些问题。有人能解释一下x

我正在探索如何使用字符串,我对这个特殊的程序有一些问题。有人能解释一下
x
以及
word[i-1-x]
的工作原理吗

为什么它必须是
i/2

为什么它必须是word[i-1-x]

#include <stdio.h>


int main()
{
     char word[15];
     int i, x;

    printf("Enter a word\n");
    scanf("%s", word);

    for(i = 0; word[i] != '\0';)
        i = i + 1;


    for(x = 0; x< i/2; x++)

        if(word[x] != word[i-1-x])
        {printf("Your word is not a palindrome\n");}
        else
        {
            printf("Your word is a palindrome\n");
        }


}
#包括
int main()
{
字符字[15];
int i,x;
printf(“输入单词”);
scanf(“%s”,单词);
对于(i=0;单词[i]!='\0';)
i=i+1;
对于(x=0;x
您正在比较字符串的一半。因此,对于
i/2
您正在查看字符串的前半部分,对于
word[i-1-x]
您正在查看字符串另一半的“镜像”位置

为什么它必须是
i/2

它不必是这样:
i
也可以工作,但它不是最优的。如果您已经检查了从两端开始的所有字符对,并且字母一直到单词中间都是相同的,那么其余的检查也会成功

例如,考虑单词
“alula”
。首先比较初始
a
与最后一个
a
,然后比较第二个位置的
l
与后面第二个位置的
l
,然后比较
u
与自身。现在您已到达单词的中间位置,位于
i/2
。如果继续,将比较相同的字符对,但会从不同的索引中选取它们。可以保证所有这些对都匹配,因此您可以通过完全跳过它们来节省一些CPU周期

为什么它必须是word[i-1-x]

#include <stdio.h>


int main()
{
     char word[15];
     int i, x;

    printf("Enter a word\n");
    scanf("%s", word);

    for(i = 0; word[i] != '\0';)
        i = i + 1;


    for(x = 0; x< i/2; x++)

        if(word[x] != word[i-1-x])
        {printf("Your word is not a palindrome\n");}
        else
        {
            printf("Your word is a palindrome\n");
        }


}

因为数组是基于零的
i-1
是最后一个字符的索引,因此
i-1-x
是从后面开始计数的
x
-th索引。

我假设您已将字符串存储在下面代码中名为string的变量中,这是函数的主要逻辑

注意:您还对for循环进行了legth/2次迭代,它将给出相同的结果

  #include<stdio.h>
  #include<string.h>
  int main()  
    {
        int i;
        int flag=0;
        for(i=0;i<strlen(string);i++)
        {
            if(string[i]==string[strlen(string)-i-1])
            flag=1;
            else
            break;
        }
        if(flag==1)
        printf("palindrome string");
        else
        printf("not palindrome string");

        return 0;
}
#包括
#包括
int main()
{
int i;
int标志=0;
对于(i=0;i