XÂU KÍ TỰ TRONG C

Khi thiết kế C bên trên Windows, chúng ta có thể sử dụng fflush() để gia công 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. Mặc dù khi thao tác làm việc với các hệ thống khác như Linux, xuất xắc Mac OS, các chuyện không đơn giản nữa: nhiều khi fflush() sẽ không làm việc. Nội dung bài viết này sẽ cho bạn một cách xử lý đơn giản rất có thể chạy được trên cả Linux, Mac OS và cả Windows.

Bạn đang xem: Xâu kí tự trong c

Vấn đề gì lúc không sử dụng fflush() với cả khi thực hiện nó?

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

Hãy chú ý đoạn công tác 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ừ bỏ ' ' nghỉ ngơi cuối lúc 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 vào C - không tồn tại fflush

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

Vậy khi sử dụng fflush() để gia công sạch cỗ đệm thì có vụ việc 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(). Thế nhưng khi chuyển công tác sang Linux hoặc Mac OS thì nhiều khi lệnh này sẽ không hề hoạt động.

Phương pháp nhập xâu vào C

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

Xem thêm: Máy Làm Đậu Phụ Công Nghiệp 3 Trong 1, Máy Làm Đậu Phụ Liên Hoàn 3A


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 vậy nếu trước đó không có số nguyên c được nhập thì sao? có vẻ như không ổn định rồi! - lịch trình sẽ dừng lại, nhận vào một trong những kí từ bỏ rồi mới tiếp tục chạy.

Vậy cách giải quyết thế nào? Tôi xin giới thiệu cách tôi sẽ 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 phường = 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 phường = readLn(fin, s, max_len);19 20 2122 return p;232425int 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 trong những xâu (s) từ keyboard (độ dài lớn nhất là 100). Quy trình nhập xâu ko bị ảnh hưởng nếu gồm sẵn một kí tự trong bộ đệm keyboard từ trước cùng sẽ chỉ dừng lại khi nhận vào một trong những xâu gồm độ lâu năm > 0.

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


Subscribe for Updates


* indicates required
Your email*
Your name
Subscribe
Please enable Javascript khổng lồ view comments.
Related Posts