不过HK总是觉着VI用着不舒服,所以他想做一个自己的编辑器,命名为VI++。
它使用命令的方式执行操作。每个操作命令按照操作名或者操作名+操作参数的形式给出。
HK要实现的操作有以下一些。
对于每一个操作,应该输出其执行后的字符串。
当然,一个好的编辑器应该是可以识别和提示错误的。
如果有以下的情况的时候会出现提示错误:
出现错误的时候,只在屏幕上输出error,对原串不执行操作。
所有下标从0开始。
输入数据第1行为操作数N(1<=N<=30),代表了后面有N个对字符串的操作。
第2行为初始字符串(可以包含空格并可能为空串)。
第3行到N+2行,每一行都有一个字符串,代表相应的操作,包含操作名和操作参数(如果有),每个操作字符串保证格式合法。
初始字符串和中间过程的字符串长度都不会超过100。
每个操作中如果含有字符串参数,则一定不含空格。
在每一个操作后输出对应操作的结果或者错误提示信息。
6 abcde double rotate 4 reverse insert 1 abc delete 4 3 change 7 8
abcdeabcde eabcdeabcd dcbaedcbae dabccbaedcbae dabbaedcbae dabbaedbcae
简单模拟题,要注意空串也是能够插入的
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char str[1000],work[1000],add[1000]; void Insert(int pos) { int i,len,len1; len = strlen(add); len1 = strlen(str); for(i = len1-1;i>=pos;i--) str[i+len] = str[i]; for(i = pos;i<pos+len;i++) str[i] = add[i-pos]; str[len1+len] = '\0'; printf("%s\n",str); } void Double() { int len = strlen(str),i; for(i = len;i<len*2;i++) str[i] = str[i-len]; str[len*2] = '\0'; printf("%s\n",str); } void Delete(int from,int to) { int i,len = to-from+1; int l = strlen(str); for(i = from;i<l;i++) { str[i] = str[i+len]; } str[l-len] = '\0'; printf("%s\n",str); } void Change(int i,int j) { char t; t = str[i]; str[i] = str[j]; str[j] = t; printf("%s\n",str); } void Reverse() { int len = strlen(str),i; char t; for(i = 0;i<len/2;i++) { t = str[i]; str[i] = str[len-1-i]; str[len-1-i] = t; } printf("%s\n",str); } void Rotate(int k) { int len = strlen(str),i; // k = k%len; while(k--) { char t = str[0]; for(i = 1;i<len;i++) str[i-1] = str[i]; str[len-1] = t; } printf("%s\n",str); } int main() { int T,len; while(~scanf("%d%*c",&T)) { gets(str); while(T--) { len = strlen(str); scanf("%s",work); if(!strcmp(work,"insert")) { int pos; scanf("%d%*c",&pos); gets(add); if(pos<0 || pos>len) { printf("error\n"); continue; } Insert(pos); } else if(!strcmp(work,"double")) { if(!len) { printf("error\n"); continue; } Double(); } else if(!strcmp(work,"delete")) { int from,to,t; scanf("%d%d",&from,&to); if(from>to) { t = from; from = to; to = t; } if(!len || from<0 || from>=len || to<0 || to>=len) { printf("error\n"); continue; } Delete(from,to); } else if(!strcmp(work,"change")) { int from,to,t; scanf("%d%d",&from,&to); if(from>to) { t = from; from = to; to = t; } if(!len || from<0 || from>=len || to<0 || to>=len) { printf("error\n"); continue; } Change(from,to); } else if(!strcmp(work,"reverse")) { if(!len) { printf("error\n"); continue; } Reverse(); } else if(!strcmp(work,"rotate")) { int k; scanf("%d",&k); if(!len) { printf("error\n"); continue; } Rotate(k); } } } return 0; }