计蒜客online judge 忽略大小写的字符串比较

题目描述
一般我们用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()函数将换行吃掉后再次输入的字符即为有效字符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值