Sự khác nhau giữa char và string

Char Là Gì – Sự Khác Biệt Giữa Char S

####Chào mừng chúng ta đến với bài học tiếp theo trong khóa học lập trình ngôn ngữ C++ hướng thực hành.

Bài Viết: Char là gì

Trong hầu hết tất cả những bài học trước đây, chúng ta chỉ làm việc với nhau trên kiểu dữ liệu số. Chúng ta sử dụng những biến lưu trữ giá trị số (số nguyên int, số thực như float hoặc double, …) để phục vụ cho việc tính toán toán học, giải quyết những bài toán đơn giản là chủ yếu.

Trong bài học ngày hôm nay, chúng ta sẽ tìm hiểu một kiểu dữ liệu cũng là một trong những kiểu dữ liệu cơ bản trong ngôn ngữ C và C++, đó là kiểu kí tự.

###Kiểu kí tự là gì?

Cũng tương tự như những kiểu dữ liệu số (int32_t, float, uint64_t, …), kiểu kí tự là một kiểu dữ liệu có độ to 1 byte (8 bits) dùng để lưu trữ 1 kí tự trong vùng nhớ máy tính. Kí tự có thể là những chữ cái đơn trong bảng chữ cái (a, b, c, … x, y z), có thể là những kí hiệu toán học (+, -, *, /, …), hay có thể là những con số (0, 1, 2, …, 9)…

Một đặc điểm của kiểu kí tự là KHÔNG PHẢI MỌI KÝ TỰ đều có thể hiển thị được lên màn hình.

Trong C/C++, kiểu kí tự có thể lưu trữ 1 kí tự trong bảng mã ASCII.

Đây là bảng mã kí tự ASCII đầy đủ:

Sự khác nhau giữa char và string

ascii.png1782×657

Bảng mã ASCII được chia làm 2 cột:

Cột Code là số thứ tự của kí tự trong bảng mã ASCII.Cột Symbol là kí tự được convert từ mã Code sang dạng có thể đọc được.

###Khai báo biến kiểu kí tự như vậy nào?

Để khai báo biến kiểu kí tự trong C/C++, ta dùng từ khóa char như sau:

char character; //declare a variable type charchar ch(65); //declare a variable type char và initialze with ASCII codechar a = “a”; //declare a variable type char và initialize with a symbol of ASCII tableCú pháp trọn vẹn giống việc thực hiện khai báo biến thông thường.

Biến kiểu kí tự (char) thực tiễn cũng là một kiểu số nguyên kích thước 1 byte (tương đương với int8_t), nó lưu trữ giá trị là mã Code của kí tự đó, nhưng khi hiển thị lên màn hình, nó cho ra kết quả là kí tự (Symbol) chứ không in ra mã ASCII của kí tự đó.

Vì thế, chúng ta có thể khởi tạo cho biến kiểu char bằng phương thức gán một kí tự đặt giữa cặp dấu nháy đơn. Ví dụ:

char ch = “a”;ch = “b”;hoặc cũng có thể gán trực tiếp mã Code của kí tự đó trong bảng mã ASCII. Ví dụ:

char ch = 97; //kí tự “a” trong bảng mã ASCII có mã là 97ch = 98; //kí tự “b” trong bảng mã ASCII có mã là 98###In biến kiểu kí tự ra màn hình

Để in một kí tự ra màn hình, chúng ta có thể thực hiện bằng nhiều phương thức khác nhau:

In trực tiếp một kí tự đặt trong cặp dấu nháy đơn:

cout Ở câu lệnh trên, mình sử dụng đối tượng người dùng cout để in ra một dãy nhiều kí tự đơn nối tiếp nhau. Sau khi chạy chương trình, dòng lệnh trên sẽ in ra màn hình dãy kí tự hello.

Sử dụng biến kiểu char để lưu trữ một kí tự:

char h = “h”, e = “e”, l = “l”, o = “o”; cout Chúng ta có thể sử dụng lại rất nhiều lần 1 biến, nên mình chỉ cần khai báo 1 lần biến l để lưu trữ kí tự ‘l’. Câu lệnh trên cho kết quả trọn vẹn tương tự, dòng hello sẽ được in ra màn hình.

In trực tiếp mã Code của kí tự trong bảng mã ASCII (nhưng ép về kiểu char):

cout (67) (43) (43) Chúng ta thử tra trong bảng mã ASCII xem thử hai số 6743 thay mặt cho 2 kí tự gì nhé, sau đó đoán xem kết quả in ra màn hình của dòng lệnh trên là gì.

Xem Ngay:  Review Nghĩa Là Gì – Nghĩa Của Từ Review

Chúng ta có thể in ra mã Code của 1 biến kí tự:

char ch = “V”; cout (ch) Bằng phương thức ép kiểu của biến ch về kiểu số nguyên, chương trình sẽ in ra 1 con số là số thứ tự của kí tự đó trong bảng mã ASCII.

Như mình đã nói, kiểu kí tự (char) trọn vẹn là kiểu số nguyên (int8_t). Để in ra kí tự thay mặt cho số nguyên đó, chúng ta cần định dạng cho nó là kiểu kí tự (char) thì compiler mới hiểu là chúng ta đang cần hiển thị kí tự chứ không phải con số.

Hiện giờ chúng ta thử in ra toàn bộ bảng mã ASCII trên màn hình dưới dạng

:

bằng phương thức sử dụng 1 vòng lặp for để in ra toàn bộ kí tự từ mã đến mã 127.

cout (ascii_code) Và kết quả in ra màn hình:

Sự khác nhau giữa char và string

Chắc chúng ta còn nhớ kí tự nổi biệt ‘t’ tương đương với 1 Tab trên màn hình console. Nếu không nhớ thì cũng không sao, mình sẽ nhắc lại một chút ở phần dưới.

Có một số mã Code cho ra kí tự khoảng trắng vì đó là những kí tự nổi biệt, ví dụ mã 7 thay mặt cho 1 tiếng Beep, nên nó không có kí tự để in ra.

###Nhập giá trị cho kiểu kí tự (char) từ bàn phím

Nhập kí tự từ bàn phím cũng tương tự việc nhập giá trị số từ bàn phím để gán cho biến. Chúng ta có thể sử dụng đối tượng người dùng cin như phương thức chúng ta sử dụng với biến số nguyên, số thực …

char ch;cout > ch;cout (ch) Chúng ta cùng nhìn vào phần kết quả chương trình mình đã thực thi dưới:

Sự khác nhau giữa char và string

Mình không thực hiện nhập 1 kí tự từ bàn phím, thay vào đó, mình nhập nhiều kí tự liên tiếp nhau, và điều gì xảy ra? Biến ch (kiểu char) chỉ nhận vào 1 kí tự duy nhất là kí tự trước tiên mà mình nhập vào.

Vậy thì những kí tự còn lại sẽ đi đâu? Nó vẫn còn được lưu trữ tạm thời bên trong đối tượng người dùng tệp tin stdin. Để kiếm chứng điều này, mình thêm một đoạn mã nhỏ sau khi in ra kí tự của biến ch trên màn hình:

char ch;cout > ch;cout (ch) Nếu cin.eof() trả về giá trị là đúng, điều này có nghĩa chúng ta đã lấy hết kí tự trong đối tượng người dùng tệp tin stdin ra và đọc được kí tự kết thúc tệp tin (EOF = End of tệp tin). Vì thế, nếu điều này không xảy ra, tức là !cin.eof() là đúng, nghĩa là vẫn còn kí tự bên trong đối tượng người dùng tệp tin stdin.

Mình sẽ chạy lại chương trình với đoạn mã mà mình vừa thêm vào để chúng ta cùng xem kết quả:

Sự khác nhau giữa char và string

Mình nhập vào “Le Tran Dat” và biến ch (kiểu char) nhận vào kí tự trước tiên (kí tự ‘L’), chương trình thông báo tiếp vẫn còn kí tự tồn tại bên trong đối tượng người dùng tệp tin stdin.

Vì thế, khi chúng ta tiếp tục thêm vào dòng lệnh nhập kí tự khác phía sau đoạn chương trình trên, nó sẽ bị không tạm dừng chờ người sử dụng nhập kí tự nữa mà nó lấy luôn kí tự tiếp theo trong đối tượng người dùng tệp tin stdin để đưa vào biến. Chúng ta cùng chạy đoạn mã lệnh sau để kiểm chứng kết quả:

char ch;cout > ch;cout (ch) > next_ch;cout Và đây là những gì chương trình cho ra kết quả:

Sự khác nhau giữa char và string

Biến ch nhận vào kí tự trước tiên là ‘L’, biến next_ch lấy ngay kí tự ‘e’ mà không đợi người sử dụng nhập thêm kí tự khác.

Sẽ có trường hợp chúng ta chỉ muốn nhận vào biến kí tự trước tiên chúng ta nhập vào, những kí tự thừa phía sau có thể là do chúng ta nhấn nhầm phím nào đó, và chúng ta muốn loại bỏ những kí tự thừa đi để nhập lại kí tự khác cho biến char tiếp theo. Trong trường hợp này, có hai phương thức để thực hiện xóa toàn bộ dữ liệu đang tồn tại trong đối tượng người dùng tệp tin stdin:

Xem Ngay:  Nhân Viên Bảo Vệ Tiếng Anh Là Gì, Nghề Nghiệp Trong Tiếng Anh

Sử dụng hàm fflush(FILE *tệp tin):

Đây là một hàm được định nghĩa trong ngôn ngữ C, nhưng chúng ta trọn vẹn có thể sử dụng nó trong ngôn ngữ C++. Hàm fflush nhận vào một đối tượng người dùng tệp tin mà chúng ta muốn xóa dữ liệu phía trong đó (trong trường hợp này là đối tượng người dùng tệp tin stdin).

Xem Ngay: Sgot Là Gì – Chỉ Số Sgot Và Sgpt Là Gì

fflush(stdin); //Add this command line where you want to clear all data in stdin tệp tin objectSử dụng phương thức ignore của đối tượng người dùng cin để bỏ qua toàn bộ kí tự bên trong đối tượng người dùng tệp tin stdin:Phương thức ignore này nhận vào 2 đối số là số kí tự nó sẽ bị bỏ qua, và kí tự khiến lệnh này tạm dừng khi gặp phải trong đối tượng người dùng tệp tin stdin, ở đây mình sử dụng kí tự ‘n’ là kí tự được tạo ra khi nhấn phím Enter.

cin.ignore( INT64_MAX, “n”);Sau khi sử dụng một trong hai phương thức trên, lần yêu cầu nhập dữ liệu từ bàn phím tiếp theo (trải qua đối tượng người dùng cin) sẽ phải thực hiện nhập lại từ đầu.

###Một phương thức nhập dữ liệu khác cho kiểu kí tự (char)

char ch;ch = cin.get(); //get method return the character which you just enteredcin.get(ch); //put a char variable into the bracketsCả 2 phương thức trên đều cho ra kết quả tương đương nhau.

###Escape sequences

Trong C/C++ có một số kí tự có ý nghĩa nổi biệt, nó được gọi là escape sequences. Một escape sequences bắt đầu bằng một dấu ‘’ và theo sau là một kí tự hoặc con số.

Sự khác nhau giữa char và string

Ví dụ:

cout Dòng lệnh trên sẽ cho ra output là:

First lineSecond lineHay dòng lệnh dưới đây:

cout Sẽ cho chúng ta kết quả:

First part Second partBạn chỉ có thể in ra kí tự nháy kép bằng phương thức thêm dấu backslash ‘’ trước kí tự nháy kép trong dãy kí tự bạn muốn in ra.

cout ###Có một số bạn thắc mắc rằng, kí tự xuống dòng ‘n’ và đối tượng người dùng endl trong thư viện iostream khác nhau như vậy nào?

Khi sử dụng std::endl (sử dụng toán tử phạm vi để truy cập vào đối tượng người dùng endl bên trong namespace std), output sẽ được đẩy vào vùng bộ nhớ đệm, đối tượng người dùng cout có thể không chuyển text trực tiếp đến thiết bị đầu ra ngay lập tức.

Cả kí tự ‘n’ và đối tượng người dùng endl đều chuyển con trỏ đến vị trí đầu dòng tiếp theo, thêm vào đó, đối tượng người dùng endl đảm bảo thứ tự trên thiết bị đầu ra đúng với lúc nhập dữ liệu từ đầu vào.

cout tương đương với

cout Sử dụng đối tượng người dùng std::endl sẽ làm sạch luôn stream, trong khi đó, sử dụng kí tự ‘n’ chỉ đơn giản là đưa kí tự xuống dòng lên màn hình.

Câu vấn đáp ngắn gọn cho việc khi nào sử dụng std::endl‘n’ là:

Sử dụng std::endl khi bạn cần đảm bảo cho ra kết quả ngay lập tức, cụ thể khi làm việc trên những thiết bị đầu ra chậm.Sử dụng ‘n’ cho những trường hợp còn lại.

###Sự khác nhau khi đặt kí tự bên trong cặp dấu nháy đơn và cặp dấu nháy kép là gì?

Như đã học trong bài này, một biến kí tự (char) chỉ được sử dụng để đặc tả 1 kí tự trong bảng mã ASCII, và chúng ta luôn đặt 1 kí tự đơn bên trong 1 cặp dấu nháy đơn.

Xem Ngay:  Đặc Tả Là Gì – Một Số Kĩ Thuật Khảo Sát Đặc Tả

char ch(“65”);ch = “a”;Những kí tự được đặt bên trong cặp dấu nháy kép được gọi là chuỗi kí tự (string). Một string là một tập hợp những kí tự nối tiếp nhau. Ví dụ:

cout Tất nhiên làm việc với chuỗi kí tự (string) sẽ phức tạp hơn, nên chúng ta sẽ được học nó trong những bài học sau.

###Do stupid thing with char type

Trước khi kết thúc bài học này, mình sẽ hướng dẫn chúng ta làm một đồ gì đó với kiểu kí tự (char) mà chúng ta đã được học.

Mình thích thực hiện nhập họ và tên của tớ (Viết không dấu do bảng mã ASCII bị giới hạn) từ bàn phím. Xóa màn hình console đi và in ra lại họ tên mà mình vừa nhập từ bàn phím, nhưng in ra lần lượt từng kí tự, mỗi lần in kí tự sẽ tạm dừng trong một khoảng thời gian ngắn.

Để thực hiện được yêu cầu này, mình sẽ đống ý cho chúng ta một số chức năng thiết yếu:

system(“cls”);

Hàm này gọi đến lệnh cls, thực hiện xóa dữ liệu đã in ra trên console.

Sleep(DWORD miliseconds);

Hàm này sẽ tạm dừng mọi việc làm thực hiện trên console trong một khoảng thời gian miliseconds mà bạn truyền vào. Để sử dụng hàm này cần thêm thư viện windows.h tại phần khai báo thư viện.

Chúng ta chưa được học phương thức để lưu trữ biến là một chuỗi những kí tự liên tiếp nhau, nên việc lưu trữ dãy kí tự tên của bạn bên trong biến là rất phức tạp. Chúng ta chỉ mới biết đến phương thức lưu trữ 1 kí tự bên trong 1 biến kiểu char.

Nhưng thử nhớ lại những điều mình đã nói, khi thực hiện nhập kí tự từ bàn phím mà bạn nhập thừa kí tự thì điều gì xảy ra? Những kí tự thừa vẫn còn lưu trữ bên trong đối tượng người dùng tệp tin stdin, vì thế, chúng ta chỉ cần lấy những kí tự đó ra 1 lần nữa trải qua đối tượng người dùng cin.

Ban đầu, chúng ta yêu cầu người sử dụng nhập tên đầy đủ của tớ vào:

char ch;cout > ch;Kí tự trước tiên mà bạn nhập sẽ lưu vào biến ch, những kí tự còn lại vẫn lưu trong đối tượng người dùng tệp tin stdin.

Tiếp theo, chúng ta thực hiện xóa màn hình console:

system(“cls”);Việc làm còn lại, chúng ta lấy lần lượt từng kí tự vẫn được lưu trong đối tượng người dùng tệp tin stdin cho đến khi gặp kí tự xuống dòng ‘n’ hoặc kí tự kết thúc tệp tin EOF. Chúng ta nhớ phải in kí tự đã lưu trong biến ch ra trước rồi mới đọc tiếp vào nhé.

do{Sleep(50); //Pause the program for 50 milisecondscout Vòng lặp trên sẽ dừng khi biến ch nhận được kí tự xuống dòng ‘n’ (lúc bạn nhấn Enter để kết thúc nhập) hoặc kí tự kết thúc tệp tin EOF.

Xem Ngay: Pullback Là Gì – Chiến Lược Giao Dịch Pullback Nâng Cao

Kết hợp những phần trên thành một chương trình hoàn chỉnh:

#include #include using namespace std;int main(){char ch;cout > ch;system(“cls”);do{cout Chúng ta thử chạy chương trình, nhập full-name của chúng ta vào xem điều gì xảy ra nhé!

Hẹn tái ngộ chúng ta trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt khúc mắc trực tiếp tại forums

www.hethongbokhoe.com

Link Videos khóa học

https://www.udemy.com/c-co-ban-danh-cho-nguoi-moi-hoc-lap-trinh/learn/v4/overview

Thể Loại: Chia sẻ Kiến Thức Cộng Đồng