Blogs

Kiểu Dữ Liệu Xâu Kí Tự Trong C ++, Xâu Ký Tự Trong C++

Bạn đang quan tâm đến Kiểu Dữ Liệu Xâu Kí Tự Trong C ++, Xâu Ký Tự Trong C++ phải không? Nào hãy cùng VCCIDATA đón xem bài viết này ngay sau đây nhé, vì nó vô cùng thú vị và hay đấy!

XEM VIDEO Kiểu Dữ Liệu Xâu Kí Tự Trong C ++, Xâu Ký Tự Trong C++ tại đây.

Khi lập trình C trên Windows, bạn có thể sử dụng fflush() để làm sạch bộ đệm trước khi nhập một xâu, tránh tình trạng “lạc trôi” của lệnh nhập xâu. Tuy nhiên khi làm việc với các hệ thống khác như Linux, hay Mac OS, mọi chuyện không đơn giản nữa: nhiều khi fflush() sẽ không làm việc. Bài viết này sẽ cho bạn một cách giải quyết đơn giản có thể chạy được trên cả Linux, Mac OS và cả Windows.

Đang xem: Xâu kí tự trong c

Vấn đề gì khi không sử dụng fflush() và cả khi sử dụng nó?

Không sử dụng fflush() (và các phương pháp thay thế):

Hãy xem xét đoạn chương trình sau:

1#include 2#include 3 4int main(int argc, char const *argv<>) 5{ 6 int c; 7 char s<100>; 8 9 printf(“c = “); scanf(“%d”, &c);10 printf(“s = “);11 fgets(s, 100, stdin);12 if (strlen(s) > 0) // xoá kí tự '
' ở cuối khi nhập bằng fgets13 if (s == '
')14 s = 0;1516 printf(“c = %d
“, c);17 printf(“s = %s
“, s);18 19 return 0;20}
Khi chạy chương trình ta thu được kết quả sau:

Trôi lệnh trong C - không có fflush

Rõ ràng xâu s đã không được nhập vào. Vấn đề này xảy ra do khi nhập c bằng scanf() thì kí tự
vẫn còn lưu trong bộ đệm bàn phím. Khi lệnh nhập s (fgets) chạy, nó gặp kí tự
trong bộ đệm do vậy trả luôn về một xâu chỉ chứa
.

Vậy khi sử dụng fflush() để làm sạch bộ đệm thì có vấn đề gì?

Bạn có thể giải quyết vấn đề trôi lệnh trên Windows bằng cách thêm một lệnh fflush() vào trước fgets(). Tuy vậy khi chuyển chương trình sang Linux hoặc Mac OS thì nhiều khi lệnh này sẽ không còn hoạt động.

XEM THÊM:  Top 12 Trung Tâm Popodoo Có Tốt Không, Học Ở Popodoo Có Tốt Không

Phương pháp nhập xâu trong C

Google một thời gian tôi cũng tìm được câu trả lời cho phương pháp nhập xâu trong các hệ thống ngoài Windows. Đơn giản là bạn thêm đoạn lệnh sau khi trong bộ đệm vẫn còn kí tự
.

Xem thêm: Uống Nước Tiểu Có Sao Không ? Sự Thật Bài Thuốc Chữa Bách Bệnh Bằng Nước Tiểu

1int ch;2do { ch = getchar(); } while (ch != '
' && ch != EOF);
Sử dụng trong chương trình bên trên thì có vẻ khá ổn. Tuy nhiên nếu trước đó không có số nguyên c được nhập thì sao? Có vẻ không ổn rồi! – Chương trình sẽ dừng lại, nhận vào một kí tự rồi mới tiếp tục chạy.

Vậy cách giải quyết thế nào? Tôi xin đưa ra cách tôi đã dùng:

1#include 2#include 3 4void removeLastEnter(char *s) { 5 if (strlen(s) != 0) 6 if (s == '
') 7 s = ''; 8} 910char* readLn(FILE * fin, char *s, int max_len) {11 char* p;12 p = fgets(s, max_len * sizeof(char), fin);1314 if (p != NULL) { // already read sth15 // Re-read line if it contain only enter character16 removeLastEnter(s);17 if (strlen(s) == 0) {18 p = readLn(fin, s, max_len);19 }20 }2122 return p;23}2425int main(int argc, char const *argv<>) {26 int c;27 char s<100>;2829 printf(“c = “); scanf(“%d”, &c);30 printf(“s = “); readLn(stdin, s, 100);31 32 printf(“c = %d
“, c);33 printf(“s = %s
“, s);34 35 return 0;36}
Hàm readLn() sẽ giúp nhập vào một xâu (s) từ bàn phím (độ dài lớn nhất là 100). Quá trình nhập xâu không bị ảnh hưởng nếu có sẵn một kí tự
trong bộ đệm bàn phím từ trước và sẽ chỉ dừng lại khi nhận vào một xâu có độ dài > 0.

XEM THÊM:  TiểU LuậN Quan ĐiểM MớI Về Công Nghiệp Hóa Hiện Đại Hóa Là Gì

Xem thêm: Directory Là Gì ? Định Nghĩa, Ví Dụ, Giải Thích Thuật Ngữ Directory

Đây là cách làm tôi sử dụng trong chương trình của mình. Nếu bạn có cách làm khác hoặc góp ý gì với cách làm này, hãy để lại comment bên dưới!

Subscribe to get updates

* indicates required
Your email*
Your name
Subscribe
Please enable Javascript to view comments.
Related Posts

Vậy là đến đây bài viết về Kiểu Dữ Liệu Xâu Kí Tự Trong C ++, Xâu Ký Tự Trong C++ đã dừng lại rồi. Hy vọng bạn luôn theo dõi và đọc những bài viết hay của chúng tôi trên website VCCIDATA.COM.VN

Chúc các bạn luôn gặt hái nhiều thành công trong cuộc sống!

Related Articles

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button