题目
你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第?00?个字符。需要支持以下操作:
1 str
:后接插入,在文档后面插入字符串?strstr,并输出文档的字符串;2 a b
:截取文档部分,只保留文档中从第a个字符起b个字符,并输出文档的字符串;3 a str
:插入片段,在文档中第a个字符前面插入字符串?strstr,并输出文档的字符串;4 str
:查找子串,查找字符串str在文档中最先的位置并输出;如果找不到输出?1。为了简化问题,规定初始的文档和每次操作中的?strstr?都不含有空格或换行。最多会有q次操作。
输入输出格式
输入格式
第一行输入一个正整数q,表示操作次数。
第二行输入一个字符串str,表示最开始的字符串。
第三行开始,往下q行,每行表示一个操作,操作如题目描述所示。
输出格式
一共输出q行。
对于每个操作1,2,3,根据操作的要求输出一个字符串。
对于操作4,根据操作的要求输出一个整数
输入输出样例
输入样例
4
ILove
1 Luogu
2 5 5
3 3 guGugu
4 gu
输出样例
ILoveLuogu
Luogu
LuoguGugugu
3
分析(了解字符串的相关库函数)
strcat函数
extern char strcat(char dest, const char src);
strcat函数将src串拼接到dest串之后
?strstr函数
extern char strstr(char str1, const char str2);
strstr函数在str1串内查找str2串的位置,如未找到,则返回NULL
strcpy函数
extern char strcpy(char dest, const char src);
strcpy函数将src串复制到dest串
对于以下分析我们规定:
str串表示原始串,in?串表示读入串或暂存串
操作1:
需使用?strcat
?函数,将in拼接到str?串后
举例:原始串:?ILove
,输入:?1 Luogu
操作后:ILoveLuogu
(存于str?串)
操作2:
需使用?strcpy
?函数
首先,将str串第a+b
位及以后舍去;
接着,将str串第a
位及以后复制到in串中暂存;
最后,将in串中暂存的内容复制回str串中。
举例:原始串:?ILoveLuoguMubuky
,输入:?2 5 5
第一步操作后:ILoveLuogu
(存于str串)
第二步操作后:Luogu
(存于in串)
第三步操作后:Luogu
(存于str串)
操作3:
需使用?strcat
?函数
首先,将str串第a
位及以后的部分接到in串后;
接着,将in串接到str串第?a
?位。
举例:原始串:?Luogu
,输入:?3 3 guGugu
第一步操作后:
guGugugu
(存于in串)
Luo
(存于str串)
第二步操作后:
LuoguGugugu
(存于str串)
操作4:
需使用?strstr
?函数
查找in串在str串中的位置,若函数返回NULL
?,则如题输出-1
,否则将函数返回的指针与字符串串首指针作差以获得其在字符串中的位置。
举例:原始串:?LuoguGugugu
,输入:?4 gu
,输出:?3
代码
#include<stdio.h>
#include<string.h>
#define MAXN 101
char str[MAXN], in[MAXN];
int main(void)
{
int q;
scanf("%d\n%s", &q, str);
for(int i = 1; i <= q; i++) {
int opt;
scanf("%d", &opt);
if (opt == 1) {
scanf("%s", in);
strcat(str, in);
printf("%s\n", str);
}
else if (opt == 2) {
int a, b;
scanf("%d %d", &a, &b);
str[a + b] = '\0';
strcpy(in, &str[a]);
strcpy(str, in);
printf("%s\n", str);
}
else if (opt == 3) {
int a;
scanf("%d %s", &a, in);
strcat(in, &str[a]);
str[a] = '\0';
strcat(str, in);
printf("%s\n", str);
}
else {
scanf("%s", in);
char *ans = strstr(str, in);
printf("%d\n", ans != NULL ? (int)(ans - str) : -1);
}
}
return 0;
}