//strcmp99.c -- @CopyLeft by tsaiwn@csie.nctu.edu.tw
/// 除了之前給過大家的 myScmp 外, 再用不同寫法寫八個版本
/// 請仔細研究這共九個版本的 string compare functions
#include <stdio.h>
#include <string.h> 
int myScmp(char*, char*);
int scmp2(char*, char*), scmp3(char*, char*), scmp4(char*, char*);
int scmp5(char*, char*), scmp6(char*, char*);
int scmp7(char*, char*), scmp8(char*, char*), scmp9(char*, char*);
/// 
int myScmp(char*x, char*y) {   // 完全與 strcmp( )做的相同!
   int i=0;
   while(x[i] != 0) { // 左邊還沒結束; 想一想若右邊先結束呢?
       if(x[i] == y[i]) { i++; continue; } // 相等, next char
       if(x[i] > y[i]) return 1;  // 不相等(右邊先結束也在這)
       else return -1;    // 左小右邊大 !
   } // 若一直都相等且右邊先結束則沒問題, 會 return 1
   if(y[i] == 0) return 0;  // 一直都相等, 且同時結束 !
   return -1;   // x < y  因一直都相等, 且 y 還沒有結束 !!!
}// myScmp(  
// ========
int scmp2(char*x, char*y) {   // 完全與 strcmp( )做的相同!
   int i=0;
   for( ; ; ) { // Loop forever  
       if(x[i] > y[i]) return 1;  // 左邊大(右邊先結束也在這)
       if(x[i] < y[i]) return -1;  // 左小, 右邊大 !
       if(x[i] == 0) return 0; // 相等, 且都是 0 表示結束!
       ++i;   // 相等, 但不是 0, next char
   } // 若一直都相等且右邊先結束則會 return 1
}// scmp2(  
/// ===
int scmp3(char x[ ], char y[ ]) { // 完全與 strcmp( )做的相同!
   while(*x) { // 左邊還沒結束; 
       if(*x == *y) { x++; ++y; continue; } // 相等, next char
       if(*x >  *y) return 1;  // 不相等 (右邊先結束也在這)
       else return -1;    // 左小右邊大 ! 
   } // 若一直都相等且左邊先結束則沒問題, 會 return 1
   if(*y == 0) return 0;  // 一直都相等, 且左右同時結束 !
   return 1;   // x > y  因一直都相等, 且 y 還沒有結束 !!!
}// scmp3  
//// ====  
int scmp4(char x[ ], char y[ ]) { // 完全與 strcmp( )做的相同!
   while(38==38) { // Loop forever
       if(*x == 0 || *y == 0) break;  // done
       if(*x != y[0]) break;   // *x 就是 x[0]
       ++x; y++; 
   } // while
   if(*x == *y) return 0;  // 一直都相等, 且左右同時結束 !
   if(*x > *y) return 1;   // x > y
   return -1;  // x < y 
}// scmp4  
/////
int scmp5(char *x, char *y) { // 完全與 strcmp( )做的相同!
   for( ;; ) { // Loop forever
       if(*x == 0 || *y == 0 || *x != *y) break;  // done
       ++x; y++; 
   } // for
   if(*x == *y) return 0;  // 一直都相等, 且左右同時結束 !
   if(*x > *y) return 1;   // x > y
   return -1;  // x < y 
}// scmp5  
//////
int scmp6(char*x, char*y) {   // 完全與 strcmp( )做的相同!
   int i=0;
   for( ;x[i]; ) { // 左邊還沒結束    
       if(x[i] > y[i]) return 1;  // 左邊大(右邊先結束也在這)
       if(x[i] < y[i]) return -1;  // 左小右邊大 !
       ++i;   // 相等, next char
   } // 若一直都相等且右邊先結束則沒問題, 會 return 1
   if(y[i] == 0) return 0;  // 一直都相等, 且同時結束 !
   return -1;   // x < y  因一直都相等, 且 y 還沒有結束 !!!
}// scmp6(  
///////
int scmp7(char*x, char*y) {   // 完全與 strcmp( )做的相同!
   int i=0;
   for( ; ; ) { // Loop forever 
       if(x[i]==0 && y[i]==0) return 0;  // 都是 0 表示結束!
       if(x[i] > y[i]) return 1;  // 左邊大(右邊先結束也在這)
       if(x[i] < y[i]) return -1;  // 左小右邊大 !
       ++i;   // 相等, next char
   } // 若一直都相等直到左邊先結束, 左 0 右非 0, 則 return -1
}// scmp7(  
/// /////
int scmp8(char x[ ], char y[ ]) { // 完全與 strcmp( )做的相同!
   int i=0;
   while(y[i] != 0) { // 右邊還沒結束; what if 左邊先結束?
       if(x[i] == y[i]) { i++; continue; } // 相等, next char
       if(x[i] > y[i]) return 1;  // 不相等
       else return -1;    // 左小右邊大 ! (左邊先結束也在這)
   } // 若一直都相等且左邊先結束則沒問題, 會 return 1
   if(x[i] == 0) return 0;  // 一直都相等, 且左右同時結束 !
   return 1;   // x > y  因一直都相等, 且 x 還沒有結束 !!!
}// scmp8  
/// /// ///
int scmp9(char x[ ], char *y) { // 完全與 strcmp( )做的相同!
   for( ;; ) { // Loop forever
       if(*x == 0 && y[0] == 0) return 0;  // done
       if(*x > *y) return 1;   // *x 就是 x[0]
       if(*x < *y) return -1;
       ++x; y++; 
   } // for
}// scmp9    
/************** 
D:\test> path C:\Dev-Cpp\bin;%path%
D:\test> gcc -c strcmp99.c

D:\test> nm strcmp99.o
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T _myScmp
0000007f T _scmp2
000000ec T _scmp3
0000014d T _scmp4
000001b6 T _scmp5
0000021b T _scmp6
0000029a T _scmp7
00000312 T _scmp8
00000391 T _scmp9

D:\test>  
***************************************/