Em muốn hỏi ý nghĩa và cách dùng của câu lệnh scanf("%[^\n]%*c", &s);
khi nhập chuỗi. Em đã thử tìm nhưng những bài giải thích bằng tiếng anh khó hiểu quá.
Ý nghĩa và cách sử dụng của: scanf("%[^\n]%*c", &s);
Vậy đoạn giải thích bằng tiếng Anh đâu?
Tài liệu cho scanf()
: http://www.cplusplus.com/reference/cstdio/scanf/
Khó hiểu thì tách ra từng phần cho dễ hiểu.
Thế bạn hiểu %[^\n]
là thế nào? Còn %*c
là thế nào?
Hiện tại mình đanh hiểu là [^\n] cho nhập cả chuỗi mà không bị ngắt tại khoảng cách
Còn cụm %*c thì mình xoá thử đi nhưng không thấy gì khác biệt, nên không hiểu
Có khác biệt chứ nhỉ.
%*c
chính là loại bỏ luôn kí tự \n
.
Bạn không thấy khác biệt vì bạn chưa gọi nó đến lần thứ 2 hoặc hơn. Thử gọi lần thứ 2 hoặc hơn xem có khác gì không?
#include <stdio.h>
#define MAX_LEN 256
int main(){
char s[MAX_LEN];
int i = 0, r = 3;
for(; i < r; ++i){
//scanf("%[^\n]%*c", s); // có %*c
scanf("%[^\n]", s); // không có %*c
printf("====\nINPUT: %s\n====\n", s);
}
}
Chạy thử luôn:
Chạy thử xong cả 2 trường hợp rồi thì nhấn vào đây
Thấy sự khác biệt chưa?
Ồ!
Nếu có thêm %*c
thì việc đọc sẽ thực hiện đúng trên từng dòng. Còn thiếu %*c
thì tất cả lệnh thực hiện scanf()
tiếp theo (sau lần gọi đầu tiên) đều thao tác trên 1 dòng duy nhất (dòng đầu) của dữ liệu nhập. Vì các lần đọc sau sẽ gặp \n
của dòng đầu và kết thúc luôn. Đó là lý do vì sao sau khi đọc xong thì loại bỏ \n
bằng %*c
.
Woa mình hiểu rồi, cảm ơn bạn rất nhiều.