跳转至

三串合一(指针与字符数组)

时间限制: 1 Sec 内存限制: 128 MB

题目描述

输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串

要求:

  1. 三个字符串的创建和输入可以使用数组,也可以不用

  2. 输入后,根据三个字符串的子串的长度,计算出新字符串的长度

  3. 使用动态数组的方法创建新的字符串,并且使用指针读取三个字符串的不同部分,并且复制到新字符串中,要求整个过程都不能使用数组下标

  4. 使用指针输出新的字符串

输入

第一行输入t表示有t个测试实例

连续三行输入三个字符串,每个字符串都包含10个字符

连续三行,每行输入数字a和b,表示每个子串的开始和结束位置。注意字符串的位置是按照一般意义从1开始计算,和编程中的数组位置不同。例如字符串abcdefg,开始位置是3,结束位置是5,那么子串就是cde

依次输入t个实例

输出

每行输出合并后的新字符串

样例输入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
2
abcdefghij
ABCDEFGHIJ
aabbccddee
3 5
2 6
8 10
AABBCCDDEE
ffgghhiijj
FFGGHHIIJJ
1 4
5 8
2 7

样例输出

1
2
cdeBCDEFdee
AABBhhiiFGGHHI

提示

解决方案

我也不知道我到底要说多少遍,各位大佬才会记得C风格字符串后面还有个'\0'要占空间的...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>

int main() {
    size_t T;
    std::cin >> T;

    while (T--) {
        char strings[3][16];
        std::cin >> strings[0] >> strings[1] >> strings[2];
        size_t bound[3][2] = {}, size = 0;
        for (size_t ir = 0; ir < 3; ++ir) {
            for (size_t ic = 0; ic < 2; ++ic) {
                std::cin >> bound[ir][ic];
                bound[ir][ic] -= 1;
            }
            size += (bound[ir][1] - bound[ir][0]);
        }
        char *string = new char[size + 1];
        char *dst = string;
        for (size_t i = 0; i < 3; ++i) {
            char *src = strings[i] + bound[i][0];
            while (src <= strings[i] + bound[i][1]) {
                *dst++ = *src++;
            }
        }
        *dst = '\0';
        std::cout << string << std::endl;
    }

    return 0;
}

评论