我在这个 C 程序中做错了什么来检查字符串是否为回文?
What Am I doing wrong in this C program to check a string is Palindrome or not?
下面是我写的检查输入的字符串是否回文的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");
}
当i = 0
时,f[n-i]
将是终止空字符,永远不会出现在字符串的中间。
因此,如果字符串长度为 2 个字符或更多,则条件 f[i+1]==f[n-i]
将为假。
(如果字符串是 1 个字符长,f[i+1]
将是第一个(也是唯一一个)字符之后的终止空字符,因此条件将为真。)
条件应该是f[i]==f[n-i-1]
.
顺便说一句,
- 您不应使用
gets()
,它具有不可避免的缓冲区溢出风险,已在 C99 中弃用并从 C11 中删除。
- 您应该在托管环境中使用标准
int main(void)
而不是 void main()
,这在 C89 中是非法的,在 C99 或更高版本中是实现定义的,除非您有特殊原因使用此非标准签名(例如,被老板或老师强制使用)。
完整固定代码示例:
#include<stdio.h>
#include<string.h>
int main(void)
{
int i,n,count=0;
char f[30 + 1]; /* allocate one more element for storeing newline character */
char* lf;
printf("Enter the string. : ");
fgets(f, sizeof(f), stdin); /* change gets() to fgets() */
/* fgets() stores newline character while gets() doesn't, so remove it */
if ((lf = strchr(f, '\n')) != NULL) *lf = '[=10=]';
n = strlen(f);
for(i=0;i<n;i++)
{
if(f[i]==f[n-i-1])
count=count+1;
}
if(count==n)
printf("\n Entered string is Palindrome");
else
printf("\n Entered string is NOT Palindrome");
}
我认为只是字符串中的索引是错误的。将其从 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;
}
下面是我写的检查输入的字符串是否回文的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");
}
当i = 0
时,f[n-i]
将是终止空字符,永远不会出现在字符串的中间。
因此,如果字符串长度为 2 个字符或更多,则条件 f[i+1]==f[n-i]
将为假。
(如果字符串是 1 个字符长,f[i+1]
将是第一个(也是唯一一个)字符之后的终止空字符,因此条件将为真。)
条件应该是f[i]==f[n-i-1]
.
顺便说一句,
- 您不应使用
gets()
,它具有不可避免的缓冲区溢出风险,已在 C99 中弃用并从 C11 中删除。 - 您应该在托管环境中使用标准
int main(void)
而不是void main()
,这在 C89 中是非法的,在 C99 或更高版本中是实现定义的,除非您有特殊原因使用此非标准签名(例如,被老板或老师强制使用)。
完整固定代码示例:
#include<stdio.h>
#include<string.h>
int main(void)
{
int i,n,count=0;
char f[30 + 1]; /* allocate one more element for storeing newline character */
char* lf;
printf("Enter the string. : ");
fgets(f, sizeof(f), stdin); /* change gets() to fgets() */
/* fgets() stores newline character while gets() doesn't, so remove it */
if ((lf = strchr(f, '\n')) != NULL) *lf = '[=10=]';
n = strlen(f);
for(i=0;i<n;i++)
{
if(f[i]==f[n-i-1])
count=count+1;
}
if(count==n)
printf("\n Entered string is Palindrome");
else
printf("\n Entered string is NOT Palindrome");
}
我认为只是字符串中的索引是错误的。将其从 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;
}