Ý nghĩa và cách sử dụng của: scanf("%[^\n]%*c", &s);

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á.

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?

1 Like

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.

4 Likes

Woa mình hiểu rồi, cảm ơn bạn rất nhiều.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?