有一个分析输入字符串是不是对称的程序的问题
做了个小程序想验证输入的字符串是不是前后对称,而且忽略大小写,句首末和标点.只要输入的字母前后对称就好.
做了一部分,不知道怎么继续了..请教大虾
#include <stdio.h>
#include <string.h>
#define size 100
void isPalindrome(char s[])
int isPalindrome( s )
{
int i;
strcpy(s,c);
strrev(char c);
i = strcmp(strsrc,strtmp)
if (i == 0)
{
return 1;
}
else
{
return 0;
}
}
int main( void )
{
char s[100];
char c[100];
printf( "Enter string:\n " );
fgets( s, 100, stdin );
n = strlen(s)-1;
if (s[n] == '\n ') s[n] = '\0 ';
isPalindrome( s );
if( 0)
{
printf( "Yes, is a palindrome. ")
}
else
{
printf( "NO, not a palindrome. ")
}
return 0;
}
[解决办法]
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int Max=0;
char *MaxP=NULL;
char FileBody[21000],Text[21000];
int FindMaxLen ()
{
int Len=0;//定义存储每次求出的回文字的长度的变量
char *Head,*Tail,*Mid,*TextEnd;//定义指针,头中尾与文件结束标志指针。
TextEnd=Text+strlen(Text);//计算文件结束位置。
for (Mid=Text;Mid <TextEnd;Mid++)//从纯字母文件中的每个字符开始遍历
{
for (Head=Tail=Mid;Head> =Text&&Tail <TextEnd&&*Head==*Tail;Head--,Tail++)//求单数情况下的回文字。
;
Head++;//这句与下面一句相当于:{Tail--;Head++;Len=Tail-Head+1;}。为什么要将Head自加呢,因为后面要记录
Len=Tail-Head; //回文字的起始指针,因此要将Head归位到合法位置。至于Tail,便无所谓了。
if (Max <Len)//如果当前回文字长度比以前的都长,那么记录下这个最优值
{
Max=Len;//记录长度。
MaxP=Head;//记录头指针。
}
for (Head=Mid,Tail=Mid+1;Head> =Text&&Tail <TextEnd&&*Head==*Tail;Head--,Tail++)//求双数情况下的回文字。
;
Head++;
Len=Tail-Head;
if (Max <Len)
{
Max=Len;
MaxP=Head;
}
}
}
int main ()
{
FILE *fin=fopen( "calfflac.in ", "r ");
FILE *fout=fopen( "calfflac.out ", "w ");
char *FileP,*TextP,*PrintP;//声明变量 FileP文件原始内容的指针 TextP去除标点后的文件内容的指针 PrintP需打印内容的指针。
int i,j,temp;//声明临时变量。
FileP=FileBody;//指针赋值。
TextP=Text;//指针赋值。
while ((temp=getc(fin))!=EOF)//从文件中读取一个字符,没有到达文件结尾就继续。
{
if (isalpha(temp))//如果当前字符是字母,就将它存入去除标点后的内容中。
*TextP++=tolower(temp);//给当前指针赋值,指针自加一。
*FileP++=temp;//当前字符存入文件原始内容数组
}
*TextP= '\0 ';//初始化数组末尾,为以后使用strlen函数测定长度提供可能。
*FileP= '\0 ';//初始化数组末尾,为以后使用strlen函数测定长度提供可能。
FindMaxLen();//寻找最长的回文字符串
fprintf(fout, "%d\n ",Max);//打印最长字符串的长度
j=MaxP-Text;//定义最长字符串距离整个文件(无标点)开头的距离。
for (i=0,PrintP=FileBody;i <=j&&*PrintP;PrintP++)//次循环目的在于在原始文件中,找到最长回文字符串的起始点。
{//i的作用是记录已经访问过的字母个数,PrintP的作用是在原始文件中记录最长回文字符串的起始位置。
//当i等于上面的j(回文字在无标点文件中与开头的距离时,停止循环)
if (isalpha(*PrintP))//如果原始文件中当前字符为字母,那么i自加1
i++;
}
PrintP--; //PrintP指针回退一格(因为只有当条件不满足时,才退出循环,这时PrintP指向的是使条件不满足的那个字符,因此要回退)
for (i=0;i <Max&&*PrintP;PrintP++)//开始打印回文字
{//i同样标识访问过纯字母的个数,以便于Max值相比较。PrintP指向原始文件中的字符。
putc(*PrintP,fout);//将PrintP指向的字符输出到输出文件中去。
if (isalpha(*PrintP))//如果当前指向的是字母,那么i自加1
i++;
}
fprintf(fout, "\n ");//输出一个回车。
exit(0);
}
你看看,我这个程序是输出一段字符串中最长的对称序列(回文字)的长度,注释比较详细,你参考一下