Hiển thị các bài đăng có nhãn chuỗi. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn chuỗi. Hiển thị tất cả bài đăng

9/5/15

Tại sao cần xóa bộ đệm bàn phím trước khi nhập chuỗi?

Thông thường, khi nhập một chuỗi trong màn hình console, ta phải có thao tác xóa bộ nhớ đệm bàn phím. Nếu không có thể thấy rằng kết quả nhập chuỗi bị sai hoặc trôi đi mất.

Trong quá trình chạy chương trình ta sẽ phải nhập bằng bàn phím, mọi ký tự bạn gõ vào bàn phím (kể cả ký tự Enter \n) đều được đẩy vào bộ nhớ đệm trước khi được gán vào biến. Nếu trước đó bạn có nhập số bằng scanf hoặc cin, chúng chỉ nhận số chứ không nhận được ký tự Enter, và ký tự Enter vẫn còn trong bộ nhớ đệm. Đến khi nhập chuỗi, các hàm nhập chuỗi nhận được ký tự Enter thì dừng nhập luôn 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ể sử dụng các hàm sau để thực hiện xóa bộ nhớ đệm.

flushall()
Hàm này được định nghĩa trong stdio.h. Nó có tác dụng xóa bộ nhớ đệm tất cả các dòng nhập, xuất chuẩn và nhập xuất file.

fflush(stdin)
Hàm fflush() trong thư viện stdio.h cũng có tác dụng tương tự flushall(). Tuy nhiên nó cho phép lựa chọn xóa bộ nhớ đệm cho stream nào. Ở đây ta truyền vào stdin để xóa bộ đệm cho dòng nhập chuẩn, tức là bàn phím.

cin.ignore()
Đây là một phương thức của đối tượng cin trong C++. Phương thức này còn có những tham số khác nghĩa là bỏ qua hay loại bỏ một số lượng ký tự trong bộ đệm hoặc bỏ qua đến khi gặp ký tự nào đó. Nếu không có tham số thì mặc định là bỏ 1 ký tự trong bộ đệm. Dùng cách này hữu ích khi nhập dữ liệu chuyển từ số sang chữ.

Vậy nên dùng hàm nào? Hàm nào cũng được, flushallfflush(stdin) có vẻ đơn giản hơn trong khi dùng cin.ignore() bạn phải cẩn thận, không lạm dụng để tránh sai ý muốn.

6/3/15

Tổng quan về kiểu string trong C++

1. string là kiểu dữ liệu mới được định nghĩa sẵn trong C++, nó có nhiều ưu điểm vượt trội và giúp tránh được những phiền phức so với chuỗi kiểu char* của C.

2. Trong C++, bạn vẫn có thể dùng kiểu char* nếu muốn. Có thể chuyển từ kiểu string sang chuỗi char* bằng phương thức c_str()

3. Cần khai báo #include<string> để có thể sử dụng đầy đủ tiện ích của string.

4. string có các phép +, += để nối chuỗi thay vì dùng hàm trong thư viện string.h như kiểu char*

5. Các hàm trong thư viện string.h (strlen, strcmp, strlwr,... ) sẽ không sử dụng được với string.

6. Có thể so sánh trực tiếp 2 chuỗi string: ==, !=, >, >=, <, <=. Nguyên tắc so sánh giống hệt như khi dùng hàm strcmp().

7. Dùng phương thức length() để lấy độ dài chuỗi, dùng phép lấy chỉ số [] để lấy từng phần tử của chuỗi.
Ví dụ:
string a = "ABCDE";
cout<< a.length();
cout<< a[2];

10/1/15

Các hàm xử lý chuỗi trong C

C cung cấp rất nhiều hàm xử lý chuỗi và tất cả đều nằm trong thư viện string.h nên trước khi dùng cần phải khai báo bằng từ khoá #include.
Các hàm thường được dùng phổ biến:

strlen
Cú pháp: unsigned int strlen(const char *str);
Chức năng: Trả về độ dài của chuỗi. Độ dài chuỗi được xác định bởi ký tự null nên không bị nhầm lẫn với chiều dài mảng ký tự.
Ví dụ: char str[100]="abcd";
Hàm strlen(str) sẽ trả về 4, trong khi toán tử sizeof(str) trả về 100.

Code C:
//Ví dụ về hàm strlen
#include<stdio.h>
#include<string.h>

void main()
{
   char str[100];
   printf("Nhập chuỗi: ");
   gets(str);
   printf("Độ dài chuỗi: %d", strlen(str));
}

strcpy
Cú pháp: char* strcpy(char *destination, const char *source);
Chức năng: Sao chép chuỗi source vào chuỗi destination và trả về chuỗi destination. Lưu ý chuỗi destination phải có kích thước bằng hoặc lớn hơn chuỗi source và chưa có giá trị nào.