三串合一(指针与字符数组)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串
要求:
-
三个字符串的创建和输入可以使用数组,也可以不用
-
输入后,根据三个字符串的子串的长度,计算出新字符串的长度
-
使用动态数组的方法创建新的字符串,并且使用指针读取三个字符串的不同部分,并且复制到新字符串中,要求整个过程都不能使用数组下标
-
使用指针输出新的字符串
输入
第一行输入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; } |