{ }codelper
1行読み込み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);