C++删除字符串中的子串erase以及substr

题目:

string str = "62354iijnjnij26758667ijn615468565ij"

将子字符串"ijn"全部删除
方法1:
该方法有个缺陷,它会将字符串中只要是ijn顺序的字符都会删除

	int pos = 0;
	while (string::npos != (pos = str.find("ijn")) )
	{
		str.erase(pos, 3);
	}
	cout << str << endl;

删除字符串中的子串
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:

Tomcat is a male ccatat
cat

输出样例:

Tom is a male
#include
using namespace std;
int main()
{
	string s1,s2;
	getline(cin,s1);
	getline(cin,s2);
	while(s1.find(s2)!=string::npos)
	{
		s1.erase(s1.find(s2),s2.length());
	}
	cout<<s1<<endl;
}

1、string.erase(pos,n) //删除从pos开始的n个字符 string.erase(0,1); 删除第一个字符
2、string.erase(pos) //删除pos处的一个字符(pos是string类型的迭代器)
3、string.erase(first,last) //删除从first到last中间的字符(first和last都是string类型的迭代器)

   s.erase(s.begin()+1,s.end()-1);
下面给你一个例子:
// string::erase
#include 
#include 
using namespace std;

int main ()
{
  string str ("This is an example phrase.");
  string::iterator it;

  // 第(1)种用法
  str.erase (10,8);
  cout << str << endl;        // "This is an phrase."

  // 第(2)种用法
  it=str.begin()+9;
  str.erase (it);
  cout << str << endl;        // "This is a phrase."

  // 第(3)种用法
  str.erase (str.begin()+5, str.end()-7);
  cout << str << endl;        // "This phrase."
  return 0;
}
```c
转载**https://www.cnblogs.com/liyazhou/archive/2010/02/07/1665421.html**
**方法2**

	int i = 0;
	while (i < str.size()-2)
	{
		if ('i' == str[i])
		{
			if ("ijn" == str.substr(i,3))
			{
				str.erase(i,3);
				continue;
			}
			//if ('j' == str[i + 1] && 'n' == str[i + 2] )
			//{
			//	str.erase(i,3);
			//	continue;
			//}
		}
		++i;
	}
	cout << str << endl;
**方法3**

	int pos = 0;
	while (pos < str.size() - 2) {
		if ("ijn" == str.substr(pos, 3)) {
			str.erase(pos, 3);
		}
		else {
			++pos;
		}
	}
	cout << str << endl;
**方法4**
```c
	string::iterator it = str.begin();
	while (it != str.end() - 2)
	{
		if ('i' == *it)
		{
			if ('j'  == *(it + 1) && 'n' == *(it + 2))
			{
				str.erase(it - str.begin(),3);
				continue;
			}
			//if ("ijn" == str.substr(it - str.begin(), 3))
			//{
			//	str.erase(it - str.begin(), 3);
			//	continue;
			//}
		}
		++it;
	}
	cout << str << endl;

转载https://blog.csdn.net/yishizuofei/article/details/79059804
补充:gets()函数来输入字符串,用fget()函数来输入字符串。gets()函数在换行时结束输入,不会把’\n’纳入字符串内容,fget()函数也是在换行时结束输入,但是会把’\n’作为字符串内容的一部分。
substr

string s="0123456789";
string str1=s.substr(5);只有一个数字5表示从下标为5开始一直到结尾
str1="56789"
string str2=s.substr(5,3);从下标为5开始截取长度为3位
str2="567"

题目
字符串循环左移(20 分)
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:

Hello World!
2

输出样例:

llo World!He

C++

#include
using namespace std;
int main()
{
	string s;
	getline(cin,s);
	int a;
	cin>>a;
	a=a%s.length();
	string s1=s.substr(0,a);
	string s2=s.substr(a);
	cout<<s2<<s1;
}

C语言
转载于https://blog.csdn.net/mikucsdn/article/details/80606282

#include
#include
int main(){
	char c[120];
	int n,len;
	gets(c);
	scanf("%d",&n);
	len=strlen(c);
	for(int i=0;i<len;i++){
		printf("%c",c[(n+i)%len]);
	}
}

不用改变原字符数组,直接输出即可。向右移动改为输出c[(len-n+i)%len]即可。

你可能感兴趣的:(C和C++,c++,c语言,算法)