题目描述:
一般我们用strcmp函数可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按 ASCII\text{ASCII}ASCII 码值大小比较),直到出现不同的字符或遇到’\0’为止。如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准(注意:如果某个字符串遇到’\0’,而另一个字符串还未遇到’\0’,则前者小于后者)。
但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如"Hello"和"hello"在忽略字母大小写时是相等的。请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。
分析:
首先创建两个字符型数组存放数据,以及两个指向字符型数组的指针,利用while语句将数据输入数组后,将两个数组内数据全部转换为小写字符,利用转换后的数据进行判断
AC程序(C语言):
#include"stdio.h"
#include"math.h"
void Btos(char *a,char *b) //输入字符全部转换为小写字符函数
{
while(*a!='\n')
{
if((*a>=65)&&(*a<=90))
{
*a +=32;
}
a++;
}
while(*b!='\n')
{
if((*b>=65)&&(*b<=90))
{
*b +=32;
}
b++;
}
}
int main()
{
char a[100],b[100];
char *pa,*pb;
int i=0;
while((a[i]=getchar())!='\n')
{
i++;
}
i=0;
while((b[i]=getchar())!='\n')
{
i++;
}
Btos(a,b);
pa = a;
pb = b;
while((*pa!='\n')&&(*pb!='\n'))//两组数据都没有结束
{
if(*pa!=*pb)
{
if(*pa>*pb)
{
printf(">");
break;
}
if(*pa<*pb)
{
printf("<");
break;
}
}
pa++;
pb++;
}
//当有一组数据或者两组数据结束时
if((*pa=='\n')&&(*pb!='\n'))
{
printf("<") ;
}
if((*pa!='\n')&&(*pb=='\n'))
{
printf(">") ;
}
if((*pa=='\n')&&(*pb=='\n'))
{
printf("=") ;
}
return 0;
}
问题分析
在考虑数据长度不同情况时,最开始写法为 两组数据中 字符数少的一组<字符数多的一组,在输入时记录下每组的字符数,暴力判断得出结果,结果证明是错误的。
该题在判断时需要两组数据从头开始判断,两组数据都没有遇到’\n’时,判断字符大小,当其中一组遇到’\n’时,判断哪组数据先结束,该组数据判定为小,或者两组数据相同。
Plus
while((a[i]=getchar())!=’\n’)
这种写法先进行赋值后进行判断,输入的两组数据都会在字符结束后有一个字符’\n’。
当遇到先输入单个整数n,随后输入n组字符串时,输入整数后的回车‘\n’会被当作是一个字符被储存,此时单独写一个getchar()函数将换行吃掉后再次输入的字符即为有效字符。