{ }codelper
子串P0054

截取第 a 到第 b 个字符

第一行给出字符串 s,第二行给出询问数 q。
接下来 q 行每行给出两个数 a、b。
对每个询问,在一行中输出 s 从第 a 个字符到第 b 个字符(两端都包含)截取出的字符串。
本题中位置像人数数一样从 1 开始。
例如 s 是 "codelper"、a = 1、b = 4 时,答案是 "code"。

输入
s 由小写英文字母和数字组成,长度 1 到 1,000。
1 ≤ q ≤ 1,000。
1 ≤ a ≤ b ≤ s 的长度
输出
q 行,每个询问截取出的字符串
样例 1 · stdin
codelper
3
1 4
5 8
3 3
stdout
code
lper
d
main.py
输入(stdin)

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

$ 就绪

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

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

截取函数的第二个参数在各语言中含义不同。
结束位置(不含该位置):Python s[a-1:b],JS/TS s.slice(a - 1, b),Java s.substring(a - 1, b)。
字符个数:C# s.Substring(a - 1, b - a + 1),C++ s.substr(a - 1, b - a + 1),Craykon s.截取(a - 1, b - a + 1)。
C 没有截取函数,用起始指针和字符个数输出:printf("%.*s", b - a + 1, s + a - 1)。
三个陷阱:① 不把从 1 数的位置换成从 0 数的下标(s[a:b]),结果会整体错一位。
② 给 Java substring 传个数、给 C# Substring 传结束位置,会得到别的字符串或越界异常。
③ C++ substr 个数过大时不报错,直接截到末尾,很难发现错误(Python 切片越界也会静默截断)。
JS 的 substr(起点, 个数) 是过时函数,不要用;substring 在两个参数颠倒时会自动交换,这点与 slice 不同。

Pythonmain.py · 5 行
s = input()q = int(input())for _ in range(q):    a, b = map(int, input().split())    print(s[a - 1:b])
JavaScriptmain.js · 7 行
const [s, q, ...rest] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out = [];for (let i = 0; i < Number(q); i++) {  const [a, b] = rest[i].split(" ").map(Number);  out.push(s.slice(a - 1, b));}console.log(out.join("\n"));
TypeScriptmain.ts · 8 行
import { readFileSync } from "node:fs";const [s, q, ...rest]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out: string[] = [];for (let i = 0; i < Number(q); i++) {  const [a, b]: number[] = rest[i].split(" ").map(Number);  out.push(s.slice(a - 1, b));}console.log(out.join("\n"));
JavaMain.java · 17 行
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));        String s = br.readLine().trim();        int q = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < q; i++) {            String[] p = br.readLine().trim().split(" ");            int a = Integer.parseInt(p[0]), b = Integer.parseInt(p[1]);            out.append(s.substring(a - 1, b)).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 19 行
using System;using System.Text; class Program{    static void Main()    {        string s = Console.ReadLine().Trim();        int q = int.Parse(Console.ReadLine());        var out_ = new StringBuilder();        for (int i = 0; i < q; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            int a = int.Parse(p[0]), b = int.Parse(p[1]);            out_.Append(s.Substring(a - 1, b - a + 1)).Append('\n');        }        Console.Write(out_);    }}
C++main.cpp · 13 行
#include <iostream>#include <string> int main() {    std::ios::sync_with_stdio(false);    std::string s;    int q, a, b;    std::cin >> s >> q;    for (int i = 0; i < q; i++) {        std::cin >> a >> b;        std::cout << s.substr(a - 1, b - a + 1) << '\n';    }}
Cmain.c · 12 行
#include <stdio.h> int main(void) {    char s[1001];    int q, a, b;    if (scanf("%1000s %d", s, &q) != 2) return 0;    for (int i = 0; i < q; i++) {        scanf("%d %d", &a, &b);        printf("%.*s\n", b - a + 1, s + a - 1);    }    return 0;}
Craykonmain.cray · 9 行
s = 控制台.读行().去空白();q = 控制台.读行().转数字();循环 (i = 0; i < q; i++){    ab = 控制台.读数字();    a = ab[0];    b = ab[1];    控制台.输出(s.截取(a - 1, b - a + 1));}