Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Toán tử stringize # và dán token ## trong macro hàm

    Chuẩn C cho phép thân của một macro dạng hàm chứa hai toán tử tiền xử lý đặc biệt:

    • Stringize (#): trong thân, cặp token liên tiếp # p với p là một tham số hình thức, được thay bằng một token duy nhất là chuỗi ký tự (đặt trong dấu nháy kép "…") chứa văn bản gốc của đối số truyền cho p — không khai triển gì thêm bên trong đối số. Văn bản này lấy bằng cách nối các token của đối số bởi đúng một khoảng trắng; nếu bên trong xuất hiện ký tự \ hoặc ", phải escape lần lượt thành \\ và \".
    • Token-paste (##): trong thân, mẫu A ## B (có thể lặp thành chuỗi A ## B ## C ...) nối trực tiếp (không khoảng trắng) văn bản của A với văn bản của B thành một token duy nhất mới (thực hiện tuần tự từ trái qua phải nếu có nhiều ## liên tiếp). Nếu A (hoặc B) là một tham số hình thức, dùng văn bản đối số tương ứng; đề bảo đảm trong các test, bất kỳ tham số nào đứng ngay cạnh ## đều được truyền một đối số đúng một token (không có khoảng trắng bên trong), nên không phát sinh nhập nhằng.

    Các tham số hình thức khác — không đứng cạnh # hay ## — được thay bằng toàn bộ dãy token của đối số tương ứng (giữ nguyên số token, không gộp thành một).

    Đề bảo đảm mỗi lượt xuất hiện # trong thân luôn ngay trước một tham số hình thức (không có # "lẻ loi"), và không có tham số nào vừa là toán hạng của # vừa là toán hạng của ## trong cùng một token của thân (tức không xảy ra chồng lấn giữa hai quy tắc).

    Cho định nghĩa macro và lời gọi (đối số của lời gọi là các dãy token thuần tuý, cách nhau bởi khoảng trắng, không chứa dấu phẩy hay dấu ngoặc bên trong — mỗi đối số được cho sẵn trên một dòng riêng), hãy in ra dãy token kết quả sau khi khai triển thân macro theo lời gọi.

    Ví dụ: thân a ## b với tham số a,b, gọi với đối số foo và bar → kết quả foobar. Thân # x với tham số x, gọi với đối số là dãy token hello world → kết quả "hello world".

    • Định dạng đầu vào:

      Dòng 1: tên macro.

      Dòng 2: danh sách tham số hình thức cách nhau bởi dấu phẩy (dòng rỗng nếu không có tham số).

      Dòng 3: thân macro — các token (kể cả # và ## như token riêng biệt) cách nhau bởi đúng một khoảng trắng (dòng rỗng nếu thân không có token nào).

      Dòng 4: số nguyên kkk (0≤k≤50 \le k \le 50≤k≤5) — số đối số truyền vào (luôn bằng số tham số hình thức).

      kkk dòng tiếp theo, mỗi dòng là các token của một đối số, cách nhau bởi khoảng trắng (có thể là dòng rỗng nếu đối số đó không có token nào).

    • Định dạng đầu ra:

      In ra đúng một dòng — dãy token kết quả sau khi khai triển thân macro, cách nhau bởi đúng một dấu cách (dòng trống nếu không còn token nào).

    Ví dụ:

    Đầu vào:

    STR
    x
    # x
    1
    hello world
    

    Đầu ra:

    "hello world"
    

    Đầu vào:

    CONCAT
    a,b
    a ## b
    2
    foo
    bar
    

    Đầu ra:

    foobar
    

    Đang tải editor...