匯東網


NOJ - T051

[編輯] [转简体]
|
作者:huidong | 分類:【編程】C 程序設計課程
[ 8 瀏覽 0 評論 2 贊 2 踩 ]

概要
字符串切片

正文

字符串切片

Time Limit: 1000ms, Memory Limit: 10000KB , Accepted: 0, Total Submissions: 0

VIDEO1

Description

Python允许对字符串做切片操作,通过s [ start : stop : step ] 这样的运算实现。它表示从start开始(包含start),每次步长step(增量),直到stop停止(不包含stop),逐个提取字符串s的字符。s的下标可以是正的,从零开始;也可以是负的,从-1开始。-1下标的字符是该字符串最后一个字符,然后往前数,如下图所示。

如果S字符串为“ABCDEFGHI”,则有下面的运算及结果。
1S[2:7]得到“CDEFG”,如果不提供step,则step默认为1
2S[-7:-2]得到“CDEFG”startstop可以同时为负值。参考上图。
3S[2:-5]得到“CD”startstop可以一个为负值。参考上图。
4S[2:7:2]得到“CEG”step2,正序间隔提取字符。
5S[6:1:-2]得到“GEC”step-2,倒序间隔提取字符。
6S[:3]得到“ABC”start不提供默认从0开始,step默认为1
7S[6:]得到“GHI”stop不提供默认为字符串末尾结束,step默认为1
8S[::-1]得到“IHGFEDCBA”,特例,不提供startstopstep-1,反序提取全部字符。
编写一个切片函数,void str_slice(char dest[], char src[], int start, int stop, int step); 将源字符串src的字符按上述规律提取到dest新字符串中。

Input

在第一行里输入一个源字符串src,第二行输入一个整数T,表示测试用例数目。接下来的T行,每行输入参数个数n、起始start、结束stop、步长step。当n3,后面输入startstopstepn2,后面输入startstop(此时step默认为1),n1,后面输入start(此时stop默认为字符串长度、step默认为1)。输入数据保证有意义。

Output

针对每个测试用例,输出字符串切片的结果。

Sample Input

ABCDEFGHI

8

2 2 7

2 -7 -2

2 2 -5

3 2 7 2

3 6 1 -2

2 0 3

1 6

3 -1 -10 -1


Sample Output

CDEFG

CDEFG

CD

CEG

GEC

ABC

GHI

IHGFEDCBA

 

#include <stdio.h>
#include <string.h>

void str_slice(char dest[], char src[], int start, int stop, int step)
{
    if (start < 0)
    {
        start += strlen(src);
    }
    if (stop < 0)
    {
        stop += strlen(src);
    }

    for (int i = start, j = 0; ; i += step, j++)
    {
        if ((step > 0 && i >= stop) || (step < 0 && i <= stop))
        {
            break;
        }
        dest[j] = src[i];
    }
}

int main()
{
    int T;
    char src[1024] = { 0 };
    scanf("%s", src);
    scanf("%d", &T);
    char dest[T][1024] = { 0 };

    for (int i=0; i < T; i++)
    {
        int n, start = 0, stop = strlen(src), step = 1;
        scanf("%d", &n);
        switch (n)
        {
        case 1:
            scanf("%d", &start);
            break;
        case 2:
            scanf("%d%d", &start, &stop);
            break;
        case 3:
            scanf("%d%d%d", &start, &stop, &step);
            break;
        }

        str_slice(dest[i], src, start, stop, step);
    }

    for (int i=0; i < T; i++)
    {
        printf("%s\n", dest[i]);
    }

    return 0;
}


[ 2] [ 2]


 評論區  0 條評論

+ 添加評論