Nhập chuỗi bằng scanf
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 14 trên 63.
Giờ đây, khi đã hiểu cách chuỗi hoạt động với ký tự kết thúc null, đã đến lúc học cách nhận đầu vào chuỗi từ người dùng. Hàm (function) scanf có thể đọc chuỗi bằng bộ chỉ định định dạng %s, nhưng hàm này có những hạn chế quan trọng mà bạn cần hiểu.
Để đọc một chuỗi bằng scanf, bạn dùng định dạng %s và truyền tên mảng ký tự (không dùng toán tử &, vì tên mảng vốn đã là địa chỉ):
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Tuy nhiên, scanf("%s", ...) có một hạn chế nghiêm trọng: hàm này dừng đọc ngay khi gặp bất kỳ ký tự khoảng trắng nào (dấu cách, tab hoặc ký tự xuống dòng). Điều này có nghĩa là nếu người dùng nhập "Hello World", scanf sẽ chỉ lấy "Hello" và để lại "World" trong bộ đệm đầu vào.
Một mối lo ngại nghiêm trọng khác là scanf không kiểm tra xem đầu vào có vừa với mảng của bạn hay không. Nếu ai đó nhập một từ dài hơn sức chứa của mảng, điều đó sẽ gây tràn bộ đệm, có thể làm chương trình của bạn gặp sự cố hoặc tạo ra lỗ hổng bảo mật. Luôn đảm bảo mảng ký tự đủ lớn để chứa đầu vào dự kiến.
Dù có những hạn chế này, scanf("%s", ...) vẫn rất phù hợp để đọc từng từ riêng lẻ, và đó chính là nội dung bạn sẽ luyện tập trong thử thách tiếp theo.
Thử thách
DễViết chương trình C minh họa cách đọc dữ liệu chuỗi từ người dùng bằng scanf và hiển thị lại dữ liệu đó. Chương trình cần:
- Khai báo một mảng ký tự có tên
usernamegồm 30 phần tử để lưu đầu vào của người dùng - Khai báo một mảng ký tự có tên
hobbygồm 25 phần tử để lưu một đầu vào khác - Dùng
printfđể nhắc người dùng bằng thông báo "Enter your username:" - Dùng
scanfvới chỉ định định dạng%sđể đọc tên người dùng vào mảngusername - Dùng
printfđể nhắc người dùng bằng thông báo "Enter your hobby:" - Dùng
scanfvới chỉ định định dạng%sđể đọc sở thích vào mảnghobby - In cả hai chuỗi bằng
printftheo đúng định dạng bên dưới
Đầu vào sẽ gồm hai từ riêng biệt, mỗi từ không có khoảng trắng.
Đầu ra cần hiển thị kết quả theo định dạng sau:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!Ví dụ: nếu người dùng nhập "Alice" làm tên người dùng và "reading" làm sở thích, đầu ra sẽ là:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!Thử thách này kiểm tra khả năng dùng scanf với chỉ định định dạng %s để đọc dữ liệu chuỗi (string), khai báo mảng ký tự có kích thước phù hợp và kết hợp đầu vào của người dùng với đầu ra được định dạng bằng printf.
Tự làm thử
#include <stdio.h>
int main() {
// TODO: Khai báo các mảng (array) ký tự (character) tại đây
// TODO: Viết code tại đây để hiển thị lời nhắc và đọc đầu vào (input)
// TODO: In ra thông báo đầu ra (output) cuối cùng
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