C語(yǔ)言解決字符串中插入和刪除某段字符串問(wèn)題
字符串中插入某段字符
核心思想
已知插入字符串的長(zhǎng)度len,將插入的位置的后面的字母統(tǒng)統(tǒng)往后移動(dòng)len個(gè)長(zhǎng)度。
最后將插入的字符串插入到被插入的字符串。
我們先定義(注意:這里我不考慮極端的情況,如字符串溢出的問(wèn)題?。?/p>
char arr[50],str[20];//arr是被插入的函數(shù),str是插入的函數(shù)
我們?cè)诖_定幾個(gè)int數(shù)
int index, lens, size, lena,j;
其中index是被插入字符串的位置,lens是str的長(zhǎng)度,lena是arr的長(zhǎng)度,size是arr的index后面要移動(dòng)lens個(gè)長(zhǎng)度
接著我們來(lái)去這str和arr
gets_s(arr); printf("輸入插入的位置和插入的字符串:"); scanf_s("%d", &index); getchar();//清除緩沖區(qū) gets_s(str);
于是,我們確定長(zhǎng)度,在確定要將index后面的所有字母都要挪動(dòng)size次,才能有足夠的空間才存入lens的長(zhǎng)度
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長(zhǎng)度要加1 indexx++; }
末尾放結(jié)束語(yǔ)句
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è)變量,來(lái)代替這個(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ì)算他的長(zhǎng)度
char arr[50]; gets_s(arr); int len = strlen(arr);
確定:
int index,lens,k,movestar;
其中 index是插入位置,movestar是要被移動(dòng)的字母的位置,lens是刪除的長(zhǎng)度
printf("輸入您要?jiǎng)h除的開(kāi)始位置和字符長(zhǎng)度"); scanf_s("%d %d", &index, &lens);
如果遇到極端情況,則
if (lens + index > len) { printf("刪除長(zhǎng)度過(guò)大!"); return 0; }
既然要移動(dòng)字母,我們肯定得先知道要移動(dòng)多少個(gè)字母,于是定義res
int res = len - index - lens + 1;//要往前挪動(dòng)的字母?jìng)€(gè)數(shù)
res加1使用為我多減掉了1
就不如說(shuō)我在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;//要開(kāi)始往前挪動(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 }
來(lái)試一下效果:
完整代碼:
#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除的開(kāi)始位置和字符長(zhǎng)度"); scanf_s("%d %d", &index, &lens); if (lens + index > len) { printf("刪除長(zhǎng)度過(guò)大!"); 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;//要開(kāi)始往前挪動(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)文章
C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08vscode+qt5+cmake編譯調(diào)試過(guò)程解析
這篇文章主要介紹了vscode+qt5+cmake編譯調(diào)試過(guò)程解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Qt如何實(shí)現(xiàn)輸入框@聯(lián)系人的@檢測(cè)的示例
本文主要介紹了Qt如何實(shí)現(xiàn)輸入框@聯(lián)系人的@檢測(cè)的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08C語(yǔ)言從基礎(chǔ)到進(jìn)階全面講解數(shù)組
數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類(lèi)型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類(lèi)型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素2022-05-05C++進(jìn)一步認(rèn)識(shí)類(lèi)與對(duì)象
類(lèi)是創(chuàng)建對(duì)象的模板,一個(gè)類(lèi)可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都是類(lèi)類(lèi)型的一個(gè)變量;創(chuàng)建對(duì)象的過(guò)程也叫類(lèi)的實(shí)例化。每個(gè)對(duì)象都是類(lèi)的一個(gè)具體實(shí)例(Instance),擁有類(lèi)的成員變量和成員函數(shù)2021-10-10C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)源代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化
本文主要介紹了QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05