编程训练[C语言]——字符串比较程序升级版(随便加个需求累死人系列)

正常的字符串比较程序是这样的:在程序中直接定义字符串a和b,运行程序仅输出比较结果,然后程序就结束了。

今天我做这道题时想加点难度:在不用gets() 的情况下,仅用getchar() 让用户自己输入a,按回车,然后输入b,按回车,显示比较结果。然后输入下一组a和b进行比较……直到用户自己输入EOF(Ctrl+D或Ctrl+Z),运行情况就像下面这样(a和b不同时,输出的是较小的字符串名):
在这里插入图片描述
看上去很简单,但我尝试了三种写法,才正确实现这种输入数据的方式。下面看代码,错误的写法被注释掉了:

#include<stdio.h>
#include<string.h>

#define MAXLENGTH 100

//  容易疏忽a和b相同的情况
int StrCmp(char *a,char *b){
    int length;
//    length=(strlen(a)<strlen(b))?strlen(a):strlen(b);
    if(strlen(a)<=strlen(b)){
        length=strlen(a);
    }
    else{
        length=strlen(b);
    }
    for(int i=0;i<length;i++){
        if(a[i]<b[i])return 1;
        else if(a[i]>b[i])return 2;
        else continue;
    }
    if(strlen(a)!=strlen(b)){
        return (strlen(a)<strlen(b))?1:2;
    }
    else{
        return 3;
    }
}

int main(){
    char a[MAXLENGTH],b[MAXLENGTH];
    char ch;
    char currentIndex=0;
    
   
//  【错误写法一】错误代码分析,企图用这种方式输入两个字符数组是致命的,会在第二个while中陷入死循环。如果仔细观察,你会发现getchar()出现的位置不正确。
//    while((ch=getchar())!=EOF){
//        while(ch!='\n'){
//            a[currentIndex++]=ch;
//        }
//        a[currentIndex]='\0';
//        currentIndex=0;
//        while(ch!='\n'){
//            b[currentIndex++]=ch;
//        }
//        b[currentIndex]='\0';
//        currentIndex=0;
//
//        if(StrCmp(a,b)==1){
//            printf("a\n");
//        }
//        else if(StrCmp(a,b)==2){
//            printf("b\n");
//        }
//        else{
//            printf("a is the same as b.\n");
//        }
//    }

//  【错误写法二】如果这样写,万一第一个字符就是回车,则其也会被赋值给a
//    while((ch=getchar())!=EOF){
//        //  因为此时已经接收了一个键盘输入的字符,所以需要先do后while
//        do{
//            a[currentIndex++]=ch;
//        }while((ch=getchar())!='\n');
//        a[currentIndex]='\0';
//        ……
//    }

//	【正确写法】
 int IsInputing_a=1;
    while(1){
        if((ch=getchar())==EOF){    //  此处不慎将==写成=,惭愧
            break;
        }
        if(ch=='\n'){
            if(IsInputing_a==1){
                IsInputing_a=1-IsInputing_a;
                a[currentIndex]='\0';
                currentIndex=0;     //此句易忽略
//                printf("length of a is %d\n",strlen(a));  //检查a的长度
            }
            else{
                IsInputing_a=1-IsInputing_a;
                b[currentIndex]='\0';
                currentIndex=0;     //此句易忽略
//                printf("length of b is %d\n",strlen(b));  //检查b的长度
                if(StrCmp(a,b)==1){
                    printf("a\n");
                }
                else if(StrCmp(a,b)==2){
                    printf("b\n");
                }
                else{
                    printf("a is the same as b.\n");
                }
            }
        }
        else{
            if(IsInputing_a==1){
                a[currentIndex++]=ch;
            }
            else{
                b[currentIndex++]=ch;
            }
        }
    }

    return 0;
}

虽然字符串比较程序的考题没这么复杂,但我这么写,锻炼了逻辑思维,此次训练还是十分有价值的。

发布了36 篇原创文章 · 获赞 41 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/umbrellalalalala/article/details/87944908