{ }codelper
补齐对齐字符串长度P0029

名字右对齐

第一行给出名字个数 n,接下来 n 行每行一个英文名字。
以最长名字的长度为宽度,把所有名字在该宽度内右对齐,按输入顺序每行输出一个。
右对齐是指在名字前面(左边)补空格,使长度等于宽度。
最长的名字原样输出,不加空格。

输入
1 ≤ n ≤ 100。
名字只含英文大小写字母,长度 1 到 20
输出
n 行,每行是左侧补空格到宽度的名字
样例 1 · stdin
3
Ann
Maximilian
Jo
stdout
       Ann
Maximilian
        Jo
main.py
输入(stdin)

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

$ 就绪

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

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

在左边补空格的函数:Python s.rjust(w),JS/TS s.padStart(w),C# s.PadLeft(w),Java String.format("%" + w + "s", s),C printf("%*s", w, s)(宽度作为参数传入),C++ std::setw(w)。
Craykon s.左填充(w)(与 C# 的 PadLeft 相同;"7".左填充(3, "0") 得到 007)。
左对齐的版本名字很像(Python ljust、C %-*s),容易搞混。
陷阱:要读完所有名字才知道宽度。
边读边输出只会对齐到目前为止的最大宽度;把宽度固定为最大长度 20 也是错的。

Pythonmain.py · 5 行
n = int(input())names = [input().strip() for _ in range(n)]width = max(len(name) for name in names)for name in names:    print(name.rjust(width))
JavaScriptmain.js · 4 行
const [first, ...rest] = require("fs").readFileSync(0, "utf8").split("\n");const names = rest.slice(0, Number(first)).map((s) => s.trim());const width = Math.max(...names.map((s) => s.length));console.log(names.map((s) => s.padStart(width)).join("\n"));
TypeScriptmain.ts · 5 行
import { readFileSync } from "node:fs";const [first, ...rest]: string[] = readFileSync(0, "utf8").split("\n");const names: string[] = rest.slice(0, Number(first)).map((s) => s.trim());const width: number = Math.max(...names.map((s) => s.length));console.log(names.map((s) => s.padStart(width)).join("\n"));
JavaMain.java · 18 行
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[] names = new String[n];        int width = 0;        for (int i = 0; i < n; i++) {            names[i] = br.readLine().trim();            width = Math.max(width, names[i].length());        }        StringBuilder out = new StringBuilder();        for (String name : names) out.append(String.format("%" + width + "s", name)).append('\n');        System.out.print(out);    }}
C#Main.cs · 14 行
using System;using System.Linq; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        string[] names = new string[n];        for (int i = 0; i < n; i++) names[i] = Console.ReadLine().Trim();        int width = names.Max(s => s.Length);        foreach (string name in names) Console.WriteLine(name.PadLeft(width));    }}
C++main.cpp · 17 行
#include <algorithm>#include <iomanip>#include <iostream>#include <string>#include <vector> int main() {    int n;    std::cin >> n;    std::vector<std::string> names(n);    size_t width = 0;    for (auto& name : names) {        std::cin >> name;        width = std::max(width, name.size());    }    for (const auto& name : names) std::cout << std::setw(static_cast<int>(width)) << name << "\n";}
Cmain.c · 15 行
#include <stdio.h>#include <string.h> int main(void) {    int n, width = 0;    char names[100][21];    if (scanf("%d", &n) != 1) return 0;    for (int i = 0; i < n; i++) {        scanf("%20s", names[i]);        int len = (int)strlen(names[i]);        if (len > width) width = len;    }    for (int i = 0; i < n; i++) printf("%*s\n", width, names[i]);    return 0;}
Craykonmain.cray · 13 行
n = 控制台.读行().转数字();names = [];width = 0;循环 (i = 0; i < n; i++){    name = 控制台.读行().去空白();    names.添加(name);    width = 数学.较大值(width, name.长度);}遍历 (name 在 names){    控制台.输出(name.左填充(width));}