pta L1-6 剪切粘贴(c语言)

张开发
2026/4/10 14:53:40 15 分钟阅读

分享文章

pta L1-6 剪切粘贴(c语言)
题目使用计算机进行文本编辑时常见的功能是剪切功能快捷键Ctrl X。请实现一个简单的具有剪切和粘贴功能的文本编辑工具。工具需要完成一系列剪切后粘贴的操作每次操作分为两步剪切给定需操作的起始位置和结束位置将当前字符串中起始位置到结束位置部分的字符串放入剪贴板中并删除当前字符串对应位置的内容。例如当前字符串为abcdefg起始位置为 3结束位置为 5则剪贴操作后 剪贴板内容为cde操作后字符串变为abfg。字符串位置从 1 开始编号。粘贴给定插入位置的前后字符串寻找到插入位置将剪贴板内容插入到位置中并清除剪贴板内容。例如对于上面操作后的结果给定插入位置前为bf插入位置后为g则插入后变为abfcdeg。如找不到应该插入的位置则直接将插入位置设置为字符串最后仍然完成插入操作。查找字符串时区分大小写。每次操作后的字符串即为新的当前字符串。在若干次操作后请给出最后的编辑结果。输入格式:输入第一行是一个长度小于等于 200 的字符串 S表示原始字符串。字符串只包含所有可见 ASCII 字符不包含回车与空格。第二行是一个正整数 N (1≤N≤100)表示要进行的操作次数。接下来的 N 行每行是两个数字和两个长度不大于 5的不包含空格的非空字符串前两个数字表示需要剪切的位置后两个字符串表示插入位置前和后的字符串用一个空格隔开。如果有多个可插入的位置选择最靠近当前操作字符串开头的一个。剪切的位置保证总是合法的。输出格式:输出一行表示操作后的字符串。输入样例:AcrosstheGreatWall,wecanreacheverycornerintheworld 5 10 18 ery cor 32 40 , we 1 6 tW all 14 18 rnerr eache 1 1 e r输出样例:he,allcornetrrwecaneacheveryGreatWintheworldAcross解题方法本题其实要实现三个功能。剪切粘贴我们约定s是长度小于等于 200 的字符串表示原始字符串str是剪贴板内容首先是剪的功能:我们求出需要剪的字符串的长度str_len题目给我了需操作的起始位置和结束位置head,end所以str_lenend-head1;然后我们就可以用strncpy函数给定复制位置s中复制的首地址复制长度就可以得到str;记得加上结束符。int lenend-head1; strncpy(str,shead-1,len); str[len]\0;其次是切的功能其实很简单我们可以让s中字符向前去覆盖剪贴板的内容以实现切的功能我们使用for循环定义ii的起始是head-1结束是iend;for(int jhead-1;jlen s_len;j){ s[j]s[jlen]; }记得之后要更新s_len的大小加入结束符s_len - len; s[s_len]\0;之后是粘贴的功能我的定义粘贴的位置insert_pos默认插在最后我们的思路是insert_pos要放在pre{插入位置前}与suf插入位置后的中间所以我们可以用for循环从s的头开始去找一个j使sjpre,sjpre_lensuf使用strncmp这个j就是我们要找的insert_pos最后我们用dor循环将s于insert_pos后面的字符往后挪腾出空间把str一一复制给s再更新一下s_len,就可以了。// // 粘贴 // int insert_pos s_len; // 默认插在最后 int pre_len strlen(pre); int suf_len strlen(suf); // 找 pre suf 的位置 for(int j0; j s_len - pre_len - suf_len; j){ if(strncmp(sj, pre, pre_len) 0 strncmp(sjpre_len, suf, suf_len) 0) { insert_pos j pre_len; break; } } // 把剪贴板 str 插入到 insert_pos 位置 int str_lenstrlen(str); // 1. 后面的字符往后挪腾出空间 for(int js_len;jinsert_pos;j--){ s[jstr_len]s[j]; } // 2. 粘贴内容 for(int j0;jstr_len;j){ s[insert_posj]str[j]; } // 3. 更新长度 s_len str_len; s[s_len] \0;完整的代码#include stdio.h #include string.h #define MAX 300 int main() { char s[MAX]; scanf(%s,s); int s_lenstrlen(s); int n; scanf(%d,n); for(int i0;in;i){ int head,end; char pre[6], suf[6]; scanf(%d %d %s %s, head, end, pre, suf); char str[MAX]; // 剪 int lenend-head1; strncpy(str,shead-1,len); str[len]\0; // 切删除 for(int jhead-1;jlen s_len;j){ s[j]s[jlen]; } s_len - len; s[s_len]\0; // // 粘贴 // int insert_pos s_len; // 默认插在最后 int pre_len strlen(pre); int suf_len strlen(suf); // 找 pre suf 的位置 for(int j0; j s_len - pre_len - suf_len; j){ if(strncmp(sj, pre, pre_len) 0 strncmp(sjpre_len, suf, suf_len) 0) { insert_pos j pre_len; break; } } // 把剪贴板 str 插入到 insert_pos 位置 int str_lenstrlen(str); // 1. 后面的字符往后挪腾出空间 for(int js_len;jinsert_pos;j--){ s[jstr_len]s[j]; } // 2. 粘贴内容 for(int j0;jstr_len;j){ s[insert_posj]str[j]; } // 3. 更新长度 s_len str_len; s[s_len] \0; } printf(%s\n,s); return 0; }

更多文章