Dùng strcmp()
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 18 trên 63.
Bạn đã học cách nối các chuỗi bằng strcat(), nhưng nếu cần xác định hai chuỗi có chứa chính xác cùng một văn bản thì sao? Trong C, bạn không thể dùng toán tử bằng (==) để so sánh chuỗi vì toán tử này chỉ so sánh địa chỉ bộ nhớ, chứ không so sánh nội dung thực tế.
Hàm strcmp() từ thư viện <string.h> giải quyết vấn đề này bằng cách so sánh hai chuỗi từng ký tự một. Hàm này thực hiện thao tác gọi là so sánh theo thứ tự từ điển, về cơ bản là so sánh các chuỗi theo thứ tự trong từ điển.
#include <stdio.h>
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2); // Trả về 0 (các chuỗi bằng nhau)Hàm (function) strcmp() trả về ba loại giá trị khác nhau: hàm trả về 0 nếu hai chuỗi giống hệt nhau, một giá trị âm nếu chuỗi thứ nhất đứng trước chuỗi thứ hai theo thứ tự bảng chữ cái, và một giá trị dương nếu chuỗi thứ nhất đứng sau chuỗi thứ hai theo thứ tự bảng chữ cái.
Hàm này rất cần thiết để đưa ra quyết định dựa trên nội dung chuỗi, chẳng hạn như xác thực đầu vào của người dùng, sắp xếp dữ liệu văn bản hoặc triển khai chức năng tìm kiếm trong chương trình của bạn.
Thử thách
DễViết chương trình C triển khai hệ thống xác minh mật khẩu đơn giản bằng hàm strcmp(). Chương trình cần:
- Đọc một số nguyên
nbiểu thị số lần đăng nhập cần xử lý - Với mỗi lần đăng nhập:
- Đọc tên người dùng từ đầu vào
- Đọc mật khẩu từ đầu vào
- Dùng
strcmp()để so sánh tên người dùng với "admin" - Dùng
strcmp()để so sánh mật khẩu với "secret123" - In thông báo phù hợp dựa trên kết quả so sánh
- Sau khi xử lý tất cả các lần thử, đếm và hiển thị số lần đăng nhập thành công
Logic xác thực đăng nhập như sau:
- Nếu cả tên người dùng và mật khẩu đều đúng: in "Login successful"
- Nếu tên người dùng đúng nhưng mật khẩu sai: in "Invalid password"
- Nếu tên người dùng sai nhưng mật khẩu đúng: in "Invalid username"
- Nếu cả tên người dùng và mật khẩu đều sai: in "Invalid credentials"
Nhớ thêm tiêu đề <string.h> để sử dụng hàm strcmp().
Đầu ra cần hiển thị kết quả theo định dạng sau:
[Login result message]
[Login result message]
...
Total successful logins: [count]Ví dụ, nếu đầu vào là:
4
admin
secret123
user
password
admin
wrong
guest
secret123Đầu ra sẽ là:
Login successful
Invalid credentials
Invalid password
Invalid username
Total successful logins: 1Thử thách này kiểm tra khả năng dùng strcmp() để so sánh các chuỗi nhằm xác định chúng có bằng nhau hay không, triển khai logic điều kiện dựa trên kết quả so sánh chuỗi và đếm số lần xuất hiện dựa trên kết quả so sánh của bạn.
Tự làm thử
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char username[100];
char password[100];
int successful_logins = 0;
// TODO: Viết code của bạn ở đây
// Xử lý từng lần đăng nhập bằng hàm (function) strcmp()
// So sánh username với "admin" và password với "secret123"
// In ra thông báo phù hợp và đếm số lần đăng nhập thành công
printf("Total successful logins: %d\n", successful_logins);
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online