输入起始位置m、长度l及字符串s,要求输出字符串s从第m个字符开始的长度为l的子串。
输入格式:
测试数据有多组,处理到文件尾。
每组测试数据输入一行,首先是以一个空格间隔的两个整数m、l,分别表示起始位置和长度,然后在一个空格之后是一个字符串s(长度不超过80,可能包含空格)。测试数据保证取得的结果字符串至少包含一个字符。
输出格式:
对于每组测试,输出字符串s从第m个字符开始的长度为l的子串(若长度不足l,则只需输出从第m个字符开始到最后一个字符结束的子串)。每两组测试数据之间留一个空行。
输入样例:
1 2 hello world!
9 6 welcome to acm world
输出样例:
he
to acm
来源:
黄龙军, 等. 大学生程序设计竞赛入门—C/C++程序设计(微课视频版), 北京:清华大学出版社, 2020.11. ISBN:9787302564744
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
- 定义数组
s
和ss
,大小为[80][80]
,用于保存输入的字符串和提取的子串。 - 使用变量
j
来记录当前已经输入的测试数据的数量,初始化为0。 - 使用
while
循环读取输入,循环条件为读取的m
和l
都不为负数。 - 在循环中,使用
gets()
函数读取字符串,将其保存在s[j]
中。 - 使用
for
循环,从索引m
到m+l-1
,将s[j]
中的字符复制到ss[j]
中。 - 在
ss[j]
的最后添加一个空字符\0
,以确保字符串的正确终止。 - 增加
j
的值,表示已经处理完一组测试数据。 - 循环结束后,使用
for
循环遍历ss
数组,使用puts()
函数逐行打印提取的子串
代码
#include<stdio.h>
int main()
{
int m, l;
char s[80][80]; // 二维数组,用于存储输入的字符串
char ss[80][80]; // 二维数组,用于存储提取的子串
int i, j = 0;
while(scanf("%d %d", &m, &l) != EOF && l >= 0)
{
gets(s[j]);
for(i = m; i < m + l; i++)
{
ss[j][i-m] = s[j][i]; // 将s[j]中的字符复制到ss[j]中,形成提取的子串
}
ss[j][l] = '\0'; // 在ss[j]的末尾添加一个空字符,以确保字符串的正确终止
j++; // 增加j的值,表示已经处理完一组测试数据
}
for(i = 0; i < j; i++) // 循环遍历已处理的测试数据
{
puts(ss[i]); // 使用puts()函数逐行打印提取的子串
if(i != j - 1)
{
printf("\n");
}
}
return 0;
}