C語言解決字符串中插入和刪除某段字符串問題
字符串中插入某段字符
核心思想
已知插入字符串的長度len,將插入的位置的后面的字母統(tǒng)統(tǒng)往后移動len個長度。
最后將插入的字符串插入到被插入的字符串。
我們先定義(注意:這里我不考慮極端的情況,如字符串溢出的問題?。?/p>
char arr[50],str[20];//arr是被插入的函數(shù),str是插入的函數(shù)
我們在確定幾個int數(shù)
int index, lens, size, lena,j;
其中index是被插入字符串的位置,lens是str的長度,lena是arr的長度,size是arr的index后面要移動lens個長度
接著我們來去這str和arr
gets_s(arr); printf("輸入插入的位置和插入的字符串:"); scanf_s("%d", &index); getchar();//清除緩沖區(qū) gets_s(str);
于是,我們確定長度,在確定要將index后面的所有字母都要挪動size次,才能有足夠的空間才存入lens的長度
lena = strlen(arr);//被 插入字符串個數(shù) lens = strlen(str);//要插入字符串個數(shù) size =lens;//一共要挪動的size次數(shù)
我們再定義一個變量indexx,作用是輔助作用,等會就懂了
int indexx = index;
最后我們用二層循環(huán)
for (int i = 0; i < size; i++) { for (j = lena; j > indexx; j--) { arr[j] = arr[j - 1];//前一個位置給后一個賦值 } //因已經(jīng)挪動位置了,故indexx和lena都要加1,才能保證第二個for能循環(huán)lena-indexx次 //因為要挪動的是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);//被插入字符串個數(shù) lens = strlen(str);//要插入字符串個數(shù) size =lens;//一共要挪動的size次數(shù) //用另一個一個變量,來代替這個變量 int indexx = index; for (int i = 0; i < size; i++) { for (j = lena; j > indexx; j--) { arr[j] = arr[j - 1];//前一個位置給后一個賦值 } //以為已經(jīng)挪動位置了,所以indexx和lena都要加1,才能保證第二次第二個for能循環(huán)lena-index次 //因為要挪動的是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),第一層是移動的程度,第二層是移動的字母個數(shù)
我們先定義一個字符串 計算他的長度
char arr[50]; gets_s(arr); int len = strlen(arr);
確定:
int index,lens,k,movestar;
其中 index是插入位置,movestar是要被移動的字母的位置,lens是刪除的長度
printf("輸入您要刪除的開始位置和字符長度"); scanf_s("%d %d", &index, &lens);
如果遇到極端情況,則
if (lens + index > len) { printf("刪除長度過大!"); return 0; }
既然要移動字母,我們肯定得先知道要移動多少個字母,于是定義res
int res = len - index - lens + 1;//要往前挪動的字母個數(shù)
res加1使用為我多減掉了1
就不如說我在abcdefg中刪除cd,則index就是3,lens就是2,movesatr就是e的位置,res就是efg這三個被移動的字母
要用兩層循環(huán)
int lenss = lens;//輔助變量 for (int i = 0; i < lenss; i++) { movestar = index + lens - 1;//要開始往前挪動字母的所在位置 for (int j = movestar,k=0; k<res; j++,k++) { arr[j - 1] = arr[j]; } arr[--len] = '\0';//置零 lens--;//因為movesatr的位置會改變,所以要-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("輸入您要刪除的開始位置和字符長度"); scanf_s("%d %d", &index, &lens); if (lens + index > len) { printf("刪除長度過大!"); return 0; } int res = len - index - lens + 1;//要往前挪動的字母個數(shù) int lenss = lens;//輔助變量 for (int i = 0; i < lenss; i++) { movestar = index + lens - 1;//要開始往前挪動字母的所在位置 for (int j = movestar,k=0; k<res; j++,k++) { arr[j - 1] = arr[j]; } arr[--len] = '\0'; lens--; } puts(arr); return 0; }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08vscode+qt5+cmake編譯調(diào)試過程解析
這篇文章主要介紹了vscode+qt5+cmake編譯調(diào)試過程解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03Qt如何實(shí)現(xiàn)輸入框@聯(lián)系人的@檢測的示例
本文主要介紹了Qt如何實(shí)現(xiàn)輸入框@聯(lián)系人的@檢測的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08C語言從基礎(chǔ)到進(jìn)階全面講解數(shù)組
數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計算機(jī)內(nèi)存里連續(xù)存放,地址編號最低的存儲單元存放數(shù)組的起始元素,地址編號最高的存儲單元存放數(shù)組的最后一個元素2022-05-05QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化
本文主要介紹了QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05