空白の入った行をまるごと読む方法は言語ごとに違います。 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);