Menu
CoddyTech

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.

challenge icon

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:

  1. Khai báo một mảng ký tự có tên username gồm 30 phần tử để lưu đầu vào của người dùng
  2. Khai báo một mảng ký tự có tên hobby gồm 25 phần tử để lưu một đầu vào khác
  3. Dùng printf để nhắc người dùng bằng thông báo "Enter your username:"
  4. Dùng scanf với chỉ định định dạng %s để đọc tên người dùng vào mảng username
  5. Dùng printf để nhắc người dùng bằng thông báo "Enter your hobby:"
  6. Dùng scanf với chỉ định định dạng %s để đọc sở thích vào mảng hobby
  7. In cả hai chuỗi bằng printf theo đú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;
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C online