我编写了一个回文代码来检查给定的字符串是否是回文。例如:妈妈,1001 ......
MY_CODE:
#include <stdio.h>
#include <stdlib.h>
#include <stdio_ext.h>
int main()
{
int i,n;
char p[999];
char flag;
printf("number of characters in the strings");
scanf("%d",&n);
printf("Enter string: ");
for (i=0;i<n;i++)
{
printf("\n");
__fpurge(stdin);
scanf("%c",&p[i]);
}
for (i=0;i<n;i++)
{
if (p[i]==p[n-1-i])
{
flag=0;
break;
}
else flag=1;
}
if (flag==1)
printf("It's not a palindrome");
if (flag==0)
printf("It's a palindrome.");
return 0;
}
我试图这样做的想法是,如果匹配的是最后一个和第一个字符,那么接下来的字符。如果它们都匹配,那么字符串就是一个回文,否则它不是那么简单,但是我的输出 显示123;妈妈;每一个废话,一个回文(&#34;甚至是单词&#39;废话&#39;:D)。
有人可以指导我吗?
P.S。:我是新手,学习C.我的操作系统:Ubuntu 15.10。
答案 0 :(得分:0)
你正在检查字符是否相同,是这样,设置flag = 0,说它是回文,但是第1次匹配会发生 - 如果没有其他匹配,则标志永远不会设置为不是一个回文。
更好的方法是假设它是一个回文,然后如果有什么提供,则将其设置为假。
#include <stdio.h>
#include <string.h>
int main()
{
char p[999];
printf("Enter string: ");
if(fgets(p, sizeof(p), stdin))
{
int palindrome = 1;
int i;
int n;
n = strlen(p);
/* handle new line at end of fgets input */
if(p[n-1] == '\n')
p[n-1] = '\0';
n = strlen(p);
/* 0 length string (after newline removed) - not a palindrome */
if(n == 0) palindrome = 0;
for(i=0;i<n/2;i++)
{
/* look for a chatacter pair that doesn't match - if find, then we don't have a palindrome */
if(p[i] != p[n-1-i])
palindrome = 0;
}
if(palindrome)
printf("is a palindrome\n");
else
printf("is not a palindrome\n");
}
return 0;
}
答案 1 :(得分:0)
从您的代码中,我有几点要说如下。
#include <string.h>
#include <stdio.h>
// #include <stdlib.h> // this is not necessary.
int main()
{
// int i,n;
// char p[999];
// char flag;
// ######################################################
// You literally don't need to input the number of characters since you can get the string's length from `strlen`.
// In addition, different inputs yield different lengths,
// therefore, it is not applicable if the input becomes extremely long, for example.
//
// printf("number of characters in the strings");
// scanf("%d",&n);
// printf("Enter string: ");
// for (i=0;i<n;i++)
// {
// printf("\n");
// __fpurge(stdin);
// scanf("%c",&p[i]);
// }
// ######################################################
char str[100];
printf( "Enter a value :");
gets( str );
int i=0;
int n;
n = strlen(str)-1;
while (i<n)
{
if (str[i++] != str[n--])
{
printf("%s is Not palidrome\n", str);
return 0;
}
}
printf("%s is palidrome\n", str);
// for (i=0;i<n;i++)
// {
// if (p[i]==p[n-1-i])
// {
// flag=0;
// break;
// }
// else flag=1;
// }
// if (flag==1)
// printf("It's not a palindrome");
// if (flag==0)
// printf("It's a palindrome.");
return 0;
}
如上所述略有修改,该代码效果很好。
注意:回文问题是一个经典问题,您可以从互联网上找到许多解决方案。您可以在here的C中引用解决方案代码。
更新:以下是fgets
和while循环的更新。
#include <string.h>
#include <stdio.h>
int main()
{
char str[100];
printf( "Enter a string (char/value) :");
fgets (str, 100, stdin);
int i=0;
int n;
n = strlen(str)-1;
while (i<n)
{
if (str[i++] != str[n--])
{
printf("%s is Not palidrome\n", str);
return 0;
}
}
printf("%s is palidrome\n", str);
return 0;
}