正常的字符串比较程序是这样的:在程序中直接定义字符串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;
}
虽然字符串比较程序的考题没这么复杂,但我这么写,锻炼了逻辑思维,此次训练还是十分有价值的。