C語言解決字符串中插入和刪除某段字符串問題
字符串中插入某段字符
核心思想
已知插入字符串的長度len,將插入的位置的后面的字母統(tǒng)統(tǒng)往后移動(dòng)len個(gè)長度。
最后將插入的字符串插入到被插入的字符串。
我們先定義(注意:這里我不考慮極端的情況,如字符串溢出的問題?。?/p>
char arr[50],str[20];//arr是被插入的函數(shù),str是插入的函數(shù)
我們?cè)诖_定幾個(gè)int數(shù)
int index, lens, size, lena,j;
其中index是被插入字符串的位置,lens是str的長度,lena是arr的長度,size是arr的index后面要移動(dòng)lens個(gè)長度
接著我們來去這str和arr
gets_s(arr);
printf("輸入插入的位置和插入的字符串:");
scanf_s("%d", &index);
getchar();//清除緩沖區(qū)
gets_s(str);于是,我們確定長度,在確定要將index后面的所有字母都要挪動(dòng)size次,才能有足夠的空間才存入lens的長度
lena = strlen(arr);//被 插入字符串個(gè)數(shù) lens = strlen(str);//要插入字符串個(gè)數(shù) size =lens;//一共要挪動(dòng)的size次數(shù)
我們?cè)俣x一個(gè)變量indexx,作用是輔助作用,等會(huì)就懂了
int indexx = index;
最后我們用二層循環(huán)
for (int i = 0; i < size; i++) {
for (j = lena; j > indexx; j--) {
arr[j] = arr[j - 1];//前一個(gè)位置給后一個(gè)賦值
}
//因已經(jīng)挪動(dòng)位置了,故indexx和lena都要加1,才能保證第二個(gè)for能循環(huán)lena-indexx次
//因?yàn)橐矂?dòng)的是index后面的字母
lena++;//arr長度要加1
indexx++;
}末尾放結(jié)束語句
arr[lena] = '\0';//結(jié)束字符串
最后插入str
//最后給插入str
int k = 0;
for (int j = index,k=0; j < index + lens; j++,k++) {
arr[j] = str[k];
}
puts(arr);完整代碼:
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main() {
//字符串的插入操作
int index, lens, size, lena,j;
char arr[50],str[20];//arr是被插入的函數(shù),str是插入的函數(shù)
gets_s(arr);
printf("輸入插入的位置和插入的字符串:");
scanf_s("%d", &index);
getchar();//清除緩沖區(qū)
gets_s(str);
lena = strlen(arr);//被插入字符串個(gè)數(shù)
lens = strlen(str);//要插入字符串個(gè)數(shù)
size =lens;//一共要挪動(dòng)的size次數(shù)
//用另一個(gè)一個(gè)變量,來代替這個(gè)變量
int indexx = index;
for (int i = 0; i < size; i++) {
for (j = lena; j > indexx; j--) {
arr[j] = arr[j - 1];//前一個(gè)位置給后一個(gè)賦值
}
//以為已經(jīng)挪動(dòng)位置了,所以indexx和lena都要加1,才能保證第二次第二個(gè)for能循環(huán)lena-index次
//因?yàn)橐矂?dòng)的是index后面的字母
lena++;
indexx++;
}
arr[lena] = '\0';//結(jié)束字符串
//最后給插入str
int k = 0;
for (int j = index,k=0; j < index + lens; j++,k++) {
arr[j] = str[k];
}
puts(arr);
return 0;
}
字符串刪除某段字符串
核心思想
兩層循環(huán),第一層是移動(dòng)的程度,第二層是移動(dòng)的字母?jìng)€(gè)數(shù)
我們先定義一個(gè)字符串 計(jì)算他的長度
char arr[50]; gets_s(arr); int len = strlen(arr);
確定:
int index,lens,k,movestar;
其中 index是插入位置,movestar是要被移動(dòng)的字母的位置,lens是刪除的長度
printf("輸入您要?jiǎng)h除的開始位置和字符長度");
scanf_s("%d %d", &index, &lens);如果遇到極端情況,則
if (lens + index > len) {
printf("刪除長度過大!");
return 0;
}既然要移動(dòng)字母,我們肯定得先知道要移動(dòng)多少個(gè)字母,于是定義res
int res = len - index - lens + 1;//要往前挪動(dòng)的字母?jìng)€(gè)數(shù)
res加1使用為我多減掉了1
就不如說我在abcdefg中刪除cd,則index就是3,lens就是2,movesatr就是e的位置,res就是efg這三個(gè)被移動(dòng)的字母

要用兩層循環(huán)
int lenss = lens;//輔助變量
for (int i = 0; i < lenss; i++) {
movestar = index + lens - 1;//要開始往前挪動(dòng)字母的所在位置
for (int j = movestar,k=0; k<res; j++,k++) {
arr[j - 1] = arr[j];
}
arr[--len] = '\0';//置零
lens--;//因?yàn)閙ovesatr的位置會(huì)改變,所以要-1
}來試一下效果:

完整代碼:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main() {
int index,lens,k,movestar;
char arr[50];
gets_s(arr);
int len = strlen(arr);
printf("輸入您要?jiǎng)h除的開始位置和字符長度");
scanf_s("%d %d", &index, &lens);
if (lens + index > len) {
printf("刪除長度過大!");
return 0;
}
int res = len - index - lens + 1;//要往前挪動(dòng)的字母?jìng)€(gè)數(shù)
int lenss = lens;//輔助變量
for (int i = 0; i < lenss; i++) {
movestar = index + lens - 1;//要開始往前挪動(dòng)字母的所在位置
for (int j = movestar,k=0; k<res; j++,k++) {
arr[j - 1] = arr[j];
}
arr[--len] = '\0';
lens--;
}
puts(arr);
return 0;
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢
這篇文章主要為大家詳細(xì)介紹了cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
采用C++實(shí)現(xiàn)區(qū)間圖著色問題(貪心算法)實(shí)例詳解
這篇文章主要介紹了采用C++實(shí)現(xiàn)區(qū)間圖著色問題(貪心算法),很經(jīng)典的算法問題,需要的朋友可以參考下2014-07-07
使用DeepSeek API 結(jié)合VSCode提升開發(fā)效率
這篇文章主要介紹了DeepSeek API與Visual Studio Code (VSCode)結(jié)合使用,以提升軟件開發(fā)效率,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
C++實(shí)現(xiàn)歸并排序(MergeSort)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)歸并排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04

