我在此C程序中检查字符串是否为回文式的错误是什么?

时间:2018-09-11 15:28:39

标签: c palindrome

以下是我编写的C程序,用于检查输入的字符串是否为回文,但它始终显示'else'语句,即该字符串不是回文:-

#include<stdio.h>
#include<string.h>
void main()
{
int i,n,count=0;
char f[30];
printf("Enter the string. :  ");
gets(f);
n = strlen(f);

for(i=0;i<n;i++)
{
    if(f[i+1]==f[n-i])
    count=count+1;
}
if(count==n)
printf("\n Entered string is Palindrome");
else
printf("\n Entered string is NOT Palindrome");

}

2 个答案:

答案 0 :(得分:0)

COPY TO时,i = 0将是终止的空字符,它将永远不会出现在字符串的中间。 因此,如果字符串长度为2个字符或更多,则条件f[n-i]将为false。 (如果字符串的长度为1个字符,则f[i+1]==f[n-i]将是第一个(也是唯一的)字符之后的终止空字符,因此条件为true。)

条件应为f[i+1]

顺便

  • 您不应该使用f[i]==f[n-i-1],它具有不可避免的缓冲区溢出风险,在C99中已弃用并从C11中删除。
  • 您应该在托管环境中使用标准gets()而不是int main(void),这在C89中是非法的,并且在C99或更高版本中是实现定义的,除非您出于特殊原因使用此非标准签名(例如,被老板或老师强迫使用)。

完整的固定代码示例:

void main()

答案 1 :(得分:0)

我认为仅在字符串中建立索引是错误的。将其从i + 1更改为i和n-i-2

#include<stdio.h>
#include<string.h>
void main()
{
    int i,n,count=0;
    char f[30];
    printf("Enter the string. :  ");
    fgets(f, 29, stdin);
    n = strlen(f);

    for(i=0;i<n;i++)
    {
        if(f[i]==f[n-i-2])
        count=count+1;
    }
    if(count==n)
    printf("\n Entered string is Palindrome");
    else
    printf("\n Entered string is NOT Palindrome");

}

另一个更有效的方法应该是:

#include<stdio.h>
#include<string.h>

void main()
{
    int i = 0,n,count=0;
    char f[30];
    printf("Enter the string. :  ");
    fgets(f, 29, stdin);
    n = strlen(f);

    while (i < n >> 1) {
        if (f[i]!=f[n-i-2]) {
            printf("\n Entered string is NOT Palindrome\n");
            return;
        }
        i++;
    }
    printf("\n Entered string is Palindrome\n");
    return;
}