{ }codelper
读取一行P0311

誊写留言簿的一行

要把展览的留言簿誊写到电脑里。
第一行给出来访编号 n。
第二行给出来访者的名字,第三行给出来访者留下的话。
名字和留言里可能有空格。
留言里还可能有两个或更多连在一起的空格。
按 "#n [名字] 留言" 的形式输出一行。
也就是依次写出 #、n、一个空格、[、名字、]、一个空格、留言。
名字和留言要和输入完全一样,连空格的个数也不能变。

输入
1 ≤ n ≤ 9,999(只给出数字,没有逗号,也没有前导 0)。
名字长 1~20 个字符,由英文字母和空格组成,不会有两个空格连在一起。
留言长 1~60 个字符,由英文字母、数字、空格和标点(.
, !
?)组成。
名字和留言都不以空格开头或结尾
输出
一行 "#n [名字] 留言"
样例 1 · stdin
27
Kim Min Su
So  quiet, I loved it!
stdout
#27 [Kim Min Su] So  quiet, I loved it!
样例 2 · stdin
3
Joy
Wow
stdout
#3 [Joy] Wow
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

怎样把含有空格的一行整行读进来,因语言而异。
Python input()、Java BufferedReader.readLine()·Scanner.nextLine()、C# Console.ReadLine()、C++ std::getline(std::cin, s)、Craykon 控制台.读行() 读入一行,并去掉行尾的换行符再交给你。
JS、TS 一次读完全部输入,再用 split("\n") 分成行。
只有 C 的 fgets 会把换行符也放进缓冲区,要自己去掉(s[strcspn(s, "\n")] = '\0')。
不去掉的话,样例 1 的 ] 会掉到下一行。
第一个陷阱是按单词读。
C++ cin >> name 和 C scanf("%s") 遇到空格就停,样例 1 的名字变成 Kim,留言的位置成了 Min。
第二个陷阱是读完数字紧接着读行。
C++ cin >> n、Java Scanner.nextInt()、C scanf("%d") 只读数字,把第一行末尾的换行符留在那里。
紧跟着的 getline·nextLine()·fgets 读到的就是剩下的空行,样例 1 变成 #27 [] Kim Min Su。
把数字也按行读入再转换(Java Integer.parseInt(br.readLine()),C 用 fgets 后 atoi),或者在 C++ 中用 cin.ignore 丢掉剩下的换行符。
第三个陷阱是分开后再接回去。
Python " ".join(input().split()) 会把 So 和 quiet 之间的两个空格缩成一个。

Pythonmain.py · 4 行
n = int(input())name = input()   # input()은 한 줄을 통째로 읽고 줄 바꿈은 떼어 준다msg = input()print(f"#{n} [{name}] {msg}")
JavaScriptmain.js · 6 行
// 입력을 한꺼번에 읽어 줄 바꿈으로 나누면 줄마다 빈칸이 그대로 남는다const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const name = lines[1];const msg = lines[2];console.log(`#${n} [${name}] ${msg}`);
TypeScriptmain.ts · 7 行
import { readFileSync } from "node:fs";// 입력을 한꺼번에 읽어 줄 바꿈으로 나누면 줄마다 빈칸이 그대로 남는다const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const name: string = lines[1];const msg: string = lines[2];console.log(`#${n} [${name}] ${msg}`);
JavaMain.java · 13 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        // 수도 줄로 읽어서 바꾸면 줄 바꿈이 남지 않는다        int n = Integer.parseInt(br.readLine().trim());        String name = br.readLine();        String msg = br.readLine();        System.out.println("#" + n + " [" + name + "] " + msg);    }}
C#Main.cs · 12 行
using System; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        string name = Console.ReadLine();   // 한 줄을 통째로, 줄 바꿈은 빼고        string msg = Console.ReadLine();        Console.WriteLine($"#{n} [{name}] {msg}");    }}
C++main.cpp · 14 行
#include <iostream>#include <limits>#include <string> int main() {    int n;    std::cin >> n;    // cin >> n은 수만 읽는다. 첫 줄에 남은 줄 바꿈을 버려야 다음 getline이 이름을 읽는다    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');    std::string name, msg;    std::getline(std::cin, name);    std::getline(std::cin, msg);    std::cout << "#" << n << " [" << name << "] " << msg << "\n";}
Cmain.c · 15 行
#include <stdio.h>#include <stdlib.h>#include <string.h> int main(void) {    char num[16], name[32], msg[80];    if (!fgets(num, sizeof num, stdin)) return 0;    if (!fgets(name, sizeof name, stdin)) return 0;    if (!fgets(msg, sizeof msg, stdin)) return 0;    /* fgets는 줄 바꿈까지 담아 주므로 직접 지운다 */    name[strcspn(name, "\n")] = '\0';    msg[strcspn(msg, "\n")] = '\0';    printf("#%d [%s] %s\n", atoi(num), name, msg);    return 0;}
Craykonmain.cray · 5 行
n = 控制台.读行().转数字();// 줄읽기는 한 줄을 통째로 준다(줄 바꿈은 빼고)name = 控制台.读行();msg = 控制台.读行();控制台.输出("#" + n + " [" + name + "] " + msg);