Nhập chuỗi ký tự C++
Ký tự '\0' được tự động thêm vào bởi trình dịch để đánh dấu điểm kết thúc của chuỗi. Vậy nên, ta nên khai báo một biến chuỗi với kích thước lớn hơn kích thước tối đa của chuỗi một đơn vị để có vị trí lưu trữ ký tự kết thúc. Show
Khai báo chuỗiBản chất của việc khai báo một chuỗi chính là khai báo một mảng ký tự một chiều. Vì thế, ta có cú pháp khai báo chuỗi như sau: char Tên_chuỗi[Kích_thước]; , trong đó, Tên_chuỗi do ta tự đặt tuân theo quy tắc đặt tên chung của ngôn ngữ C, Kích_thước là một số nguyên dương thể hiện số lượng ký tự tối đa của chuỗi. Ví dụ, nếu bạn muốn khai báo một chuỗi có tên là str và có kích thước tối đa là 25 ký tự, ta có thể làm như sau: char str[26]; Dưới đây là một số ví dụ nữa về cách khai báo chuỗi: char str1[4] = {'L', '0', 'P'}; //khai báo và gán từng ký tự cho chuỗi str1 char str2[4] = "Lop"; /* ngôn ngữ C sẽ tự động ghi ký tự kết thúc là NULL, tức là ' \0' */ char str3[] = "Study"; //không cần khai báo kích thước Xin lưu ý là bạn không thể làm như sau: char S[5]; S="abc"; //sai, chương trình sẽ hiểu là gán mảng cho mảng vì chuỗi là mảng ký tự một chiều Nhập liệu cho chuỗiSử dụng hàm gets() (thuộc thư viện Ví dụ sau sẽ nhập liệu cho chuỗi a có kích thước tối đa là 30: char a[30]; printf("\nMoi ban nhap mot chuoi: "); gets(a); Ngoài ra, ta cũng có thể sử dụng hàm scanf() để nhập liệu cho chuỗi, khi đó ta sử dụng định dạng của chuỗi là %s. Lưu ý là scanf() không cho phép nhập chuỗi có dấu cách và do đó, khuyến nghị là không nên dùng hàm này để nhập chuỗi. Chú ý: nếu trước khi nhập chuỗi ta đã nhập một số thì trong bộ đệm nhập liệu còn tồn tại ký tự Enter, khi đó ký tự này sẽ được đưa cho chuỗi dẫn đến không nhập liệu được. Để khắc phục điều này ta sử dụng lệnh sau đặt trước hàm gets(): fflush(stdin); . Ví dụ: #include <stdio.h> main() { char a[30]; int n; printf("\nMoi nhap mot so: "); scanf("%d",&n); printf("\nMoi ban nhap mot chuoi: "); fflush(stdin); //<= ta cần sử dụng lệnh này // để đảm bảo bộ đệm nhập liệu không chứa // gì trước khi nhập chuỗi hoặc ký tự gets(a); return 0; } Ví dụ về xử lý chuỗiViết chương trình chuyển đổi một chuỗi ký tự thường thành HOA. Dưới đây trình bày hai cách xử lý yêu cầu này. * Cách 1: Dùng hàm toupper(ch) (thuộc thư viện #include<stdio.h> #include<ctype.h> #define n 20 main() { char s[n]; int i; printf("\nMoi nhap 1 chuoi bat ky: "); for ( i = 0 ; i < n ; i ++ ) s[i]=toupper(getchar()); //nhập ký tự và đổi thành hoa rồi lưu vào mảng kết xuất chuỗi s printf("\nChuoi sau khi duoc chuyen doi thanh chuoi in hoa:\n"); for(i=0; i<n; i++) putchar(s[i]); //in từng ký tự ra màn hình return 0; } * Cách 2: Dùng hàm strupr(str) thuộc thư viện Ở bài học trước, bạn đã nắm được TOÁN TỬ QUAN HỆ, LOGIC, BITWISE,MISC VÀ ĐỘ ƯU TIÊN TOÁN TỬ TRONG C++ (Operators). Hôm nay, mình sẽ hướng dẫn về phần Cơ bản về chuỗi ký tự trong C++ (String). Nội dungĐể đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần: Trong bài ta sẽ cùng tìm hiểu các vấn đề:
Tổng quan về chuỗi ký tự (std::string)Bạn đã được tiếp xúc với chuỗi ký tự (string) ngay từ bài học C++ đầu tiên qua chương trình kinh điển bên dưới:
Chuỗi ký tự là tập hợp các ký tự được đặt trong dấu ngoặc kép. Dùng để biểu diễn những thông báo, văn bản, … trong chương trình. Trong chương trình trên, "Hello, HowKteam.com!" chính là một chuỗi ký tự. Trong C++, kiểu chuỗi ký tự không được xây dựng sẵn (không phải là “built-in string”) mà được cài đặt trong một lớp của thư viện chuẩn STL (C++ Standard Template Library). Khai báo, khởi tạo và gán giá trị một chuỗi ký tựĐể sử dụng chuỗi trong C ++, bạn cần phải #include thư viện string thuộc namespace std.
Bạn có thể sử dụng namespace std để có thể sử dụng string một cách ngắn gọn hơn:
Tương tự như các biến thông thường, bạn có thể khởi tạo hoặc gán giá trị cho biến string theo nhiều cách:
Xuất một chuỗi ký tự (string output):Ở bài NHẬP & XUẤT DỮ LIỆU TRONG C++ (Input and Output), bạn đã biết cách nhập xuất dữ liệu trong C++. Đối với chuỗi ký tự, thao tác xuất cũng tương tự:
Outputs:
Nhập một chuỗi ký tự (string input)Đối với các kiểu dữ liệu cơ bản, bạn sử dụng đối tượng std::cin để đọc một thông tin nào đó từ thiết bị nhập chuẩn (mặc định là bàn phím), sau đó lưu thông tin đó vào một biến. Cùng thử với kiểu dữ liệu std::string:
Outputs: Trong chương trình trên, khi nhập chuỗi “Hello HowKteam.com! Free Education!” và nhấn enter, chương trình đã bỏ qua lần nhập tiếp theo và xuất ra kết quả.
Vì vậy, chương trình có 2 lần yêu cầu nhập chuỗi, nhưng khi bạn nhập một chuỗi có 3 khoảng trắng như trên, nó chỉ cho phép bạn nhập vào 1 lần. Nhập văn bản bằng std::getline()Để đọc đầy đủ chuỗi có khoảng trắng từ đối tượng nhập của lớp iostream (ví dụ cin), bạn nên sử dụng hàm std::getline() (trong namespace std) Ví dụ:
Outputs: Ở chương trình trên, bạn đã nhập được chuỗi ký tự bao gồm cả khoảng trắng với hàm std::getline(). Kết hợp giữ std::cin và std::getline() sẽ gây ra kết quả không mong muốnVí dụ:
Outputs: Khi bạn nhập một thông tin bất kỳ, mọi ký tự bạn gõ vào bàn phím (kể cả ký tự Enter 3) đều được đẩy vào bộ nhớ đệm trước khi được gán vào biến.Trong chương trình trên, bạn nhập số bằng std:: cin, chúng chỉ nhận số chứ không nhận được ký tự Enter (‘\n’), và ký tự Enter vẫn còn trong bộ nhớ đệm. Đến khi nhập chuỗi, hàm std::getline() nhận được ký tự Enter từ bộ nhớ đệm thì kết thúc nhập và chương trình vẫn chạy tiếp. Điều này khiến kết quả bị sai. Bạn có thể xóa ký tự Enter ‘\n’ sau khi sử dụng std::cin bằng cách sử dụng phương thức cin.ignore() thuộc namespace std:
Ví dụ:
Outputs:
Nhập một văn bản bao gồm ký tự xuống dòngMặc định, hàm std::getline() sử dụng ký tự ‘\n’ khi nhấn phím Enter là ký tự báo hiệu kết thúc việc nhập chuỗi. Nếu muốn nhập nhiều dòng văn bản vào một biến string, bạn có thể thay đổi nó, ví dụ: 0Outputs: Trong chương trình trên, bạn có thể nhập chuỗi ký tự cho đến khi chương trình nhận vào ký tự gạch dưới ‘_’. Kết quả nhận được là một chuỗi ký tự gồm nhiều dòng. Một số thao tác cơ bản với chuỗi ký tựNối chuỗi (Appending strings)Bạn có thể sử dụng toán tử + để nối hai chuỗi với nhau, hoặc toán tử += để nối thêm một chuỗi khác. Ví dụ: 1Outputs:
Độ dài chuỗi ký tự (String length)Lớp string định nghĩa cho chúng ta 2 phương thức để thực hiện việc lấy ra độ dài của chuỗi kí tự. Ví dụ: 2Outputs: Kết luậnQua bài học này, bạn đã nắm được Cơ bản về chuỗi ký tự trong C++ ( std::string ). Std::string là tương đối phức tạp, và còn nhiều tính năng khác mà bạn chưa cần phải biết đến tại thời điểm này. Bạn sẽ được hướng dẫn kỹ hơn ở những bài học sau. Ở bài tiếp theo, bạn sẽ được học về BIẾN CỤC BỘ & TẦM VỰC CỦA BIẾN TRONG C++ (Variable scope) Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”. Thảo luậnNếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng. |