以下是我编写的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");
}
答案 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;
}