//strcmp99.c -- @CopyLeft by tsaiwn@csie.nctu.edu.tw /// 除了之前給過大家的 myScmp 外, 再用不同寫法寫八個版本 /// 請仔細研究這共九個版本的 string compare functions #include #include 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> ***************************************/