Hướng dẫn lập trình C Phần 5 - Biến ký tự

theanh

Administrator
Nhân viên
Trong hai hướng dẫn trước, chúng ta đã thảo luận về những điều cơ bản của biến, bao gồm cách chúng chiếm bộ nhớ. Nhưng chúng ta chủ yếu tập trung vào số nguyên và số thực. Trong hướng dẫn này, chúng ta sẽ thảo luận về ký tự (hoặc biến kiểu char).

Biến kiểu 'char' chiếm 1 byte (hoặc 8 bit) trong bộ nhớ. Như tôi đã đề cập trước đó trong trường hợp 'int' và 'float', bạn có thể kiểm tra lượng bộ nhớ mà một ký tự chiếm dụng trên hệ thống của mình bằng cách sử dụng chương trình C sau:
Mã:
#include 

int main (void)
{
 printf("\n sizeof char in bytes is %u", sizeof(char));
 
 return 0;
}
Trên hệ thống của tôi, đầu ra như sau:
Mã:
sizeof char in bytes is 1
Bây giờ đến câu hỏi về cách chấp nhận các ký tự làm đầu vào từ người dùng và cách để in chúng ra đầu ra. Vâng, để chấp nhận các ký tự trong đầu vào, có một hàm chuyên dụng có tên là 'getchar'. Tương tự như vậy, để in các ký tự riêng lẻ, bạn có 'putchar'. Đoạn mã sau đây sẽ giúp bạn hiểu rõ hơn về cách các hàm này hoạt động:
Mã:
#include 

int main (void)
{
 int c;
 c = getchar();
 putchar(c);
 
 return 0;
}
Khi được thực thi, đoạn mã trên trước tiên sẽ đợi người dùng nhập một ký tự. Sau đó, nó chỉ đơn giản là xuất ra cùng một ký tự trên thiết bị đầu cuối.

Bạn có thể hơi ngạc nhiên khi giá trị 'getchar' trả về được lưu trữ trong một số nguyên, nhưng đó là cách nó hoạt động (hàm trả về một int). Nhưng bạn luôn có thể so sánh giá trị trả về bởi 'getchar' với một ký tự. Đây là một ví dụ:
Mã:
#include 

int main (void)
{
 int c;
 c = getchar();
 if(c == 'a')
 {
 printf("matched");
 }
 else
 {
 printf ("doesn't match");
 } 
 return 0;
}
Vì vậy, ở đây, nếu người dùng nhập 'a', thì chương trình sẽ in 'matched' ở đầu ra. Else, bạn sẽ thấy 'doesn't match'.

Ồ, và vâng, đây là lần đầu tiên chúng ta sử dụng các câu lệnh 'if' và 'else'. Như bạn đã hiểu, 'if' cho phép bạn thực thi một tập hợp các câu lệnh nếu một điều kiện là đúng. Khi điều kiện 'if' không thành công, quá trình thực thi mã sẽ tự động nhập khối 'else'. Lưu ý rằng bạn có thể sử dụng câu lệnh 'if' mà không có câu lệnh 'else', nhưng ngược lại thì không hợp lệ.

Bây giờ, quay lại với getchar và putchar, chúng ta hãy thảo luận nhanh về cách sử dụng các hàm này để giải quyết các vấn đề thực tế. Giả sử bạn muốn đếm số dòng mà người dùng cung cấp làm đầu vào cho chương trình của mình, thì bạn có thể thực hiện theo cách sau:
Mã:
#include 

int main (void)
{
 int c =0, counter=0;
 c = getchar();
 while(c != EOF)
 {
 c = getchar();
 if(c == '\n')
 counter = counter+1;
 } 
 printf("\n Đầu vào chứa %d dòng \n", counter+1);
 return 0;
}
Để hiểu chương trình trên, trước tiên bạn phải biết EOF là gì. Vâng, EOF là viết tắt của End Of File. Nó được sử dụng để biểu thị rằng người dùng đã nhập xong dữ liệu đầu vào.

Vì vậy, khi bạn, với tư cách là người dùng cung cấp dữ liệu đầu vào, hoàn tất quy trình, bạn nhấn ctrl+d (một vài lần). Chính hành động này tạo ra giá trị tương đương với giá trị của EOF, có thể được kiểm tra trong chương trình - giống như chúng ta đã làm.

Quay lại chương trình, trước tiên bạn kiểm tra ký tự đầu tiên của dữ liệu đầu vào để xem nó có phải là EOF không. Nếu không, bạn nhập vòng lặp while và liên tục kiểm tra từng ký tự cho đến khi bạn nhận được EOF. Trong toàn bộ quá trình này, bất cứ khi nào bạn nhận được ký tự xuống dòng (\n), bạn tăng biến 'counter'.

Sau khi phát hiện EOF, vòng lặp while kết thúc và chúng ta in ra số dòng, nhiều hơn giá trị của counter một đơn vị.

Lý do chúng ta thêm một vào 'counter' trong hàm 'printf' là vì số dòng luôn nhiều hơn một đơn vị so với số ký tự xuống dòng (hoặc theo cách nói của người bình thường, là số lần người dùng nhấn phím 'Enter'). Tất nhiên, điều này giả định rằng bất cứ khi nào người dùng nhấn enter, họ cũng nhập một số văn bản.

Vì vậy, nếu bạn cung cấp cho chương trình này một đầu vào như sau:
Mã:
Xin chào 
Chào mừng đến với HowtoForge 
Cảm ơn
Đầu ra sẽ là:
Mã:
Theinputcontains3lines
Lưu ý rằng mã của chúng ta giả định rằng người dùng sẽ cung cấp ít nhất một dòng. Một số trường hợp góc không được xử lý cố ý để giữ cho mọi thứ đơn giản. Một là khi người dùng cung cấp EOF mà không cung cấp bất kỳ ký tự nào khác trong đầu vào, và một là khi một dòng đã được cung cấp mà không cung cấp ký tự xuống dòng.

Tính số dòng chỉ là một ví dụ. Bạn cũng có thể mở rộng mã này để tính tổng số từ mà người dùng nhập vào. Hãy coi đây là một phép gán và tự mình thử mã hóa. Theo gợi ý, tôi sẽ nói hãy xem xét các khoảng trắng (' ') và tab ('\t'), tương tự như cách chúng ta xem xét các dòng mới ('\n') để tính số dòng.

Trong hướng dẫn này, chúng ta đã thảo luận thêm một chút về các ký tự, bao gồm cách sử dụng chúng, chấp nhận chúng làm đầu vào và in chúng ra. Chúng ta cũng đã thảo luận về một ví dụ trong đó hàm getchar giúp chúng ta tính toán số dòng trong đầu vào. Hãy thử bài tập tôi đã giao ở đoạn cuối và cho tôi biết nếu bạn có bất kỳ nghi ngờ hoặc thắc mắc nào.
 
Back
Bên trên