Khi sử dụng ngôn ngữ lập trình C bạn sẽ gặp nhiều trường hợp so sánh. Có mã được sử dụng để so sánh nếu một vài nguyên nhỏ hơn, lớn hơn hoặc bằng với đầu vào khác. Cũng có một vài những so sánh được sử dụng như một phương pháp bảo mật. Bạn có bao giờ hỏi: “Làm cách nào mã máy tính có thể cung cấp bảo mật chỉ bằng cách so sánh các từ”? Để có thể giúp bạn trả lời câu hỏi này thì hôm nay Box.edu sẽ so sánh chuỗi trong c strcmp giúp bạn ngay nhé!
Xem thêm: Cách làm việc với Text: C String Concatenation hiệu quả
Xem thêm: Tổng hợp 25 câu hỏi phỏng vấn C phổ biến nhất hiện nay
Xem thêm: Hướng dẫn cách đọc từ các tệp trong C bằng Fread
Mục lục bài viết
Tổng quan về chuỗi c trong strcmp
Tổng quan về chuỗi c trong hàm strcmp
Hàm strcmp trong string.h
Khi so sánh hai số trong ngôn ngữ C thì các bạn có thể sử dụng một vài phép toán rất đơn giản như là: <, >, >=, <=, ==, !=
, tuy nhiên để so sánh chuỗi chính xác thì các bạn không thể dùng các phép toán đó mà cần phải dùng hàm strcmp nằm trong thư viện của string.h.
Một điểm nữa là hàm strcmp so sánh chuỗi s1 và chuỗi s2 và cho ta một kết quả đó là:
- 1 Nếu s1 lớn hơn s2
- 0 Nếu s1 giống với s2
- -1 Nếu s1 nhỏ hơn s2
Lưu ý rằng: Trong Linux, hàm này sẽ thường trả về giá trị âm, dương hoặc bằng 0 (là khoảng cách giữa 2 ký tự khác nhau tương ứng trong s1 và s2).
Ví dụ so sánh chuỗi trong c strcmp
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <stdio.h> #include <string.h> int main() { char s1[20]; char s2[20]; do { printf ( "Enter s1: " ); gets (s1); printf ( "Enter s2: " ); gets (s2); int x = strcmp (s1, s2); printf ( "x = %d" , x); if (x < 0) printf ( " => %s < %s" , s1, s2); if (x > 0) printf ( " => %s > %s" , s1, s2); if (x == 0) printf ( " => %s = %s" , s1, s2); printf ( "\n\n" ); } while ( strcmp (s1, s2) != 0); return 0; } |
Cho ra kết quả là:
- Enter s1: Hang
Enter s2: Ho
x = -1 => Hang < Ho - Enter s1: Hong
Enter s2: Hon
x = 1 => Hong > Hon - Enter s1: Hung
Enter s2: hung
x = -1 => Hung < hung - Enter s1: Quan
Enter s2: Quan
x = 0 => Quan = Quan
So sánh chuỗi trong c strcmp
So sánh chuỗi trong c strcmp
Hiện nay hàm so sánh chuỗi trong c strcmp được coi là phổ biến nhất. Cũng là do định dạng đơn giản của nó. Dưới đây là ví dụ một đoạn mã C được hiển thị định dạng cơ bản như sau:
Hàm strcmp so sánh chuỗi của s1 với chuỗi của s2 và trả về một giá trị. Hàm trả về giá trị bằng 0 nếu hai chuỗi có giá trị bằng nhau, sẽ là một số dương được trả về nếu s1 có giá trị lớn hơn s2 và kết quả trả về số âm nếu s1 có giá trị nhỏ hơn s2. Trong quá trình sử dụng hàm strcmp, bạn phải cẩn thận để ý xem bạn nhập chuỗi nào vào trước. Nếu bạn không chú ý thì bạn sẽ trả về một giá trị không mong muốn, từ đó có thể gây ra sự tàn phá trên mã của bạn.
Trong trường hợp bạn muốn so sánh các từ, thì có thể bạn sẽ cảm thấy hơi bối rối và không hiểu rằng tại sao chúng ta lại phải sử dụng hàm so sánh các chuỗi. Trong khi sử dụng C, bạn nên lưu ý rằng một chuỗi là một mảng các ký tự kết thúc bằng ký tự null (). Dựa vào định nghĩa này, các từ mà chúng ta quen gọi là chuỗi. Cụ thể dưới đây là một đoạn mã sẽ giải thích strcmp một cách dễ hiểu hơn:
char str1 [] = “con hổ”;
char str2 [] = “con hổ”;
a = strcmp (str1, str2);
Ở ví dụ trên bạn nghĩ rằng giá trị của “a” sẽ là bao nhiêu? Nếu bạn đoán là a = 0 thì bạn đã chính xác. Cả hai dây trên đều được đặt thành “tiger” bằng nhau nên chúng sẽ bằng nhau. Bây giờ chúng ta sẽ xem xét một vài tình huống thực tế hơn mà hàm này được sử dụng đó là:
/ * Chương trình C mẫu minh họa việc sử dụng hàm strcmp * /
#include <stdio.h>
#include <string.h>
void main ()
{
char str1 [] = “Sắp xếp theo thứ tự chữ cái”;
char str2 [] = “Bảng chữ cái”;
int a;
a = strcmp (str2, str1);
if (a == 0)
{
printf (“Các chuỗi bằng nhau”);
}
khác
{
printf (“Các chuỗi không bằng nhau”);
}
trả về 0;
}
Trước khi bắt đầu phân tích mã sẽ làm gì, bạn hãy xem các tệp tiêu đề. Tiêu đề <string.h> được bao gồm cùng với <stdio.h>. Điều này là do hàm strcmp được dùng để định nghĩa trong tiêu đề <string.h>. Nếu tiêu đề này không được bao gồm trong mã, thì strcmp cùng với rất nhiều hàm khác sẽ không hoạt động bình thường và sẽ xảy ra lỗi trong quá trình biên dịch.
Đoạn mã trên sẽ so sánh hai chuỗi str1 và str2. Khi mã này được biên dịch, câu hỏi đặt ra là những gì sẽ được in ra ngoài màn hình? Khi quá trình so sánh được thực hiện, chúng ta nên mong đợi hàm if-else in “Các chuỗi không bằng nhau” ra màn hình vì “Bảng chữ cái” và này sẽ không bằng nhau một cách chính xác.
Trong mã, bạn có thể thấy rằng “a” sẽ được khai báo là một số nguyên. Điều này là do khi hai chuỗi được so sánh với nhau thì hàm trả về một giá trị số. Bạn cũng có thể tự hỏi tại sao một giá trị số được trả về và giá trị của “a” sẽ là bao nhiêu? Đồng thời giá trị này sẽ bằng hiệu số ASCII của hai ký tự đầu tiên không khớp nhau. Trong mã của các ví dụ ở trên, ký tự “i” và “s” là hai ký tự đầu tiên không khớp. Giá trị ASCII của i lúc này là 105 và s có giá trị là 115. Điều này sẽ mang lại cho bạn sự khác biệt là 10 có nghĩa là giá trị của chuỗi str2 thường sẽ có giá trị lớn hơn giá trị của mỗi chuỗi str1.
Thực tế strcmp sẽ hữu ích cho việc so sánh mật khẩu. So sánh chuỗi trong c strcmp và trả về giá trị 0 nếu cả hai chuỗi chính xác bằng nhau. Điều này rất hữu ích vì nếu mật khẩu đã nhập không khớp với mật khẩu trong cơ sở dữ liệu được mã sử dụng thì quyền truy cập vào trang Web này sẽ bị từ chối. Đoạn mã dưới đây cho thấy cách strcmp có thể được sử dụng để xác minh mật khẩu:
/ * Chương trình C mẫu minh họa việc sử dụng hàm strcmp * /
#include <stdio.h>
#include <string.h>
void main ()
{
char userpassword [] = cisgreat;
char userpasswordEntered [];
int a;
printf (“Vui lòng nhập mật khẩu của bạn:“);
scanf (userpasswordEntered);
a = strcmp (userpassword, userpasswordEntered);
if (a == 0)
{
printf (“Mật khẩu đã được xác minh”);
}
khác
{
printf (“Mật khẩu không hợp lệ”);
}
trả về 0;
}
Đoạn mã trên đã được gán mật khẩu của người dùng là “cisgreat” và sử dụng chức năng scanf để lấy mật khẩu từ người dùng trước khi cho phép việc truy cập vào tài liệu nhạy cảm. Nếu có bất kỳ tổ hợp ký tự nào khác ngoài “cisgreat” được nhập làm mật khẩu, hàm if-else sẽ in “Mật khẩu không hợp lệ” ra ngoài màn hình. Ngay cả khi chuỗi “CISGREAT” được nhập thì câu lệnh if cũng sẽ không được thực hiện thành công. Điều này là do thực tế mặc dù các chữ cái giống nhau được sử dụng, thì chuỗi “CISGREAT” cũng không được trình biên dịch đánh giá bằng “cisgreat”. Thêm nữa là do mã ASCII của mỗi ký tự được so sánh với mã của ký tự ở cùng một vị trí trong chuỗi khác. Các ký tự “C” và “c” có mã ASCII tương ứng là 67 và 99, khác biệt nhau.
So sánh chuỗi trong c strcmp với số ký tự chỉ định
Trong trường hợp bạn chỉ muốn so sánh một vài ký tự được chỉ định giữa 2 chuỗi. Ví dụ như là chỉ so sánh 3 ký tự đầu tiên trong mỗi chuỗi ban đầu chẳng hạn. Thì lúc này chúng ta sẽ dùng đến hàm strncmp().
Hàm strncmp() trong C là một hàm có sẵn trong header file string.h. Giúp chúng ta có thể tìm hiệu mã ký tự ASSCII giữa 2 chuỗi trong C. Thông qua hiệu này, chúng ta có thể so sánh 2 chuỗi trong C. Và tìm ra mối quan hệ giữa chúng là bằng, lớn hay nhỏ.
Các bạn sử dụng hàm strncmp() để so sánh 2 chuỗi trong C với số ký tự chỉ định với cú pháp cụ thể: strncmp(str1, str2,n)
Trong đó str1
và str2
là 2 chuỗi cần được so sánh, và n
chính là phạm vi số ký tự tối đa được tính từ đầu hai chuỗi dùng để so sánh.
Trên thực tế thì hàm strncmp() cũng sử dụng hiệu mã ký tự ASSCII giữa hai chuỗi để so sánh chúng. Điểm khác biệt đó là thay vì so sánh trên toàn bộ 2 chuỗi ban đầu, thì chúng ta chỉ tiến hành so sánh trên một phạm vi được quyết định bởi đối số n
khi sử dụng hàm strcmp() mà thôi.
int main(void) { char s1[10] = "abA"; char s2[10] = "aba"; int n = 2; printf("Ma ascii cua a:%d\n", 'a');//Ma ascii cua a:97 printf("Ma ascii cua A:%d\n", 'A');//Ma ascii cua A:65 printf("Ma ascii cua b:%d\n", 'b');//Ma ascii cua b:98 printf("Hieu ma ascii: %d\n",strncmp(s1,s2,n));//hiệu ma ascii: 0 if(strncmp(s1,s2,2)==0){ printf("%d ky tu dau cua 2 chuoi bang nhau", n); } else if(strncmp(s1,s2,2)>0){ printf("%d ky tu dau cua %s lon hon %s", n, s1, s2); } else printf("%d ky tu dau cua %s nho hon %s", n, s1, s2); return 0; } |
Kết quả đó là:
Ma ascii cua a:97 Ma ascii cua A:65 Ma ascii cua b:98 Hieu ma ascii: 0 2 ky tu dau cua 2 chuoi bang nhau |
Với ví dụ này do chỉ định n=2
nên chúng ta chỉ so sánh 2 ký tự đầu ở mỗi chuỗi là ab
và ab
mà thôi. Do đó kết quả trả về là bằng nhau.
Tổng kết
So sánh chuỗi trong c strcmp là một trong những thao tác quen thuộc. Và đặc biệt strcmp là một trong những hàm so sánh được sử dụng nhiều nhất trong ngôn ngữ C. Nó được sử dụng để kiểm tra sự bình đẳng của hai từ hoặc chuỗi đơn giản như là “mèo” và “chó”. Nó cũng có thể được dùng như một phần của quá trình mã hóa mật khẩu.