1. Hàm strcmp()
Hàm strcmp()
Để so sánh 2 xâu trong C thì bạn không thể sử dụng các toán tử so sánh mà phải dùng hàm, quy tắc so sánh 2 xâu là xét theo thứ tự từ điển.
Thứ tự từ điển được quyết định bởi mã ASCII, mã ASCII nhỏ hơn sẽ có thứ tự từ điển nhỏ hơn, ví dụ kí tự 'A' thì có thứ tự từ điển nhỏ hơn kí tự 'B'
Khi so sánh 2 xâu theo thứ tự từ điển thì ta lần lượt so sánh 2 kí tự ở cùng vị trí của 2 xâu
Cú pháp :
int strcmp(char *s, char *t)
Tham số : s và t là 2 con trỏ hoặc 2 mảng char[]
Giá trị trả về :
- < 0 nếu s nhỏ hơn t theo từ điển
- 0 nếu s giống t
- > 0 nếu s lớn hơn t theo từ điển
Trong 1 số trình biên dịch thì khi s < t sẽ trả về -1 và khi s > t sẽ trả về 1.
Ví dụ giá trị trả về khi so sánh 2 xâu bằng hàm strcmp
| xâu s | xâu t | strcmp(s, t) |
| 28tech | 28tech abc | -1 |
| 28tech | 28aech zzzz | 1 |
| 28tech | 28tech | 0 |
| 28tech | 28techabcd | -1 |
Ví dụ :
#include "stdio.h" #include "string.h" #include "ctype.h" int main(){ char s[1000] = "28tech python"; char t[1000] = "28tech java"; char c[1000] = "28tech python"; printf("%d\n", strcmp(s, t)); // p > j if(strcmp(s, c) == 0){ printf("Hai xau ky tu giong nhau !\n"); } return 0; }
Output :
1 Hai xau ky tu giong nhau !
Xây dựng hàm strcmp() :
Để xây dựng hàm này ta cần xét 2 kí tự ở cùng vị trí của 2 xâu, nếu gặp kí tự đầu tiên khác nhau thì dựa vào thứ tự từ điển của kí tự này để suy ra thứ tự từ điển của 2 xâu ban đầu
Nếu không có kí tự nào khác nhau ta so sánh tới chiều dài, nếu chiều dài cũng giống nhau thì 2 xâu bằng nhau theo thứ tự từ điển
Code :
#include "stdio.h" #include "string.h" #include "ctype.h" int my_strcmp(char *s, char *t){ int len1 = strlen(s), len2 = strlen(t); int min_len = len1 < len2 ? len1 : len2; for(int i = 0; i < min_len; i++){ if(s[i] != t[i]){ if(s[i] > t[i]) return 1; else return -1; } } if(len1 < len2) return -1; else if(len1 > len2) return 1; else return 0; } int main(){ char s[1000] = "28tech python"; char t[1000] = "28tech"; char c[1000] = "28tech python"; printf("%d %d %d", my_strcmp(s, t), my_strcmp(s, c), my_strcmp(t, c)); return 0; }
Output :
1 0 -1
2. Hàm strncmp()
Hàm strncmp() sử dụng để so sánh n kí tự đầu tiên của 2 xâu trong C
Cú pháp :
int strncmp(char *s, char *t, size_t n)
Tham số và giá trị trả về của hàm này tương tự hàm strcmp()
Lưu ý trong trường hợp 2 xâu có 1 xâu không đủ n kí tự thì xâu dài hơn sẽ có thứ tự từ điển lớn hơn.
Ví dụ :
#include "stdio.h" #include "string.h" #include "ctype.h" int main(){ char s[1000] = "28tech python"; char t[1000] = "28tech java"; char c[1000] = "28te"; printf("%d\n", strncmp(s, t, 6)); printf("%d\n", strncmp(s, t, 8)); printf("%d\n", strncmp(s, c, 5)); return 0; }
Output :
0 1 1
3. Hàm strcmpi()
Hàm strcmpi()
Hàm strcmpi() sử dụng để so sánh 2 xâu mà không phân biệt kí tự in hoa hay in thường.
Hàm này giống hàm strcmp() về tham số
Giá trị trả về :
- > 0 nếu xâu thứ nhất lón hơn xâu thú 2
- = 0 nếu xâu thứ nhất bằng xâu thứ 2
- < 0 nếu xâu thứ nhất nhỏ hơn xâu thứ 2
Giá trị trả về là hiệu số của mã ASCII của 2 kí tự khác nhau đầu tiên trong 2 xâu
Ví dụ :
#include "stdio.h" #include "string.h" #include "ctype.h" int main(){ char s[1000] = "28TECH"; char t[1000] = "28tech"; char c[1000] = "28abc"; char d[1000] = "28CCaa"; printf("%d\n", strcmpi(s, t)); printf("%d\n", strcmpi(c, d)); return 0; }
Output :
0 -2
Xây dựng hàm strcmpi()
#include "stdio.h" #include "string.h" #include "ctype.h" int my_strcmpi(char *s, char *t){ int len1 = strlen(s), len2 = strlen(t); int min_len = len1 < len2 ? len1 : len2; for(int i = 0; i < min_len; i++){ if(tolower(s[i]) != tolower(t[i])){ return tolower(s[i]) - tolower(t[i]); } } if(len1 < len2) return '\0' - t[min_len]; else if(len1 > len2) return s[min_len] - '\0'; else return 0; } int main(){ char s[1000] = "28TECH"; char t[1000] = "28tech"; char c[1000] = "28abc"; char d[1000] = "28abca"; printf("%d\n", my_strcmpi(s, t)); printf("%d\n", my_strcmpi(c, d)); return 0; }
Output :
0 -97
Video hàm trong string.h :