算法笔记 3.6 字符串处理 练习题


STL中关于字符串的常用函数

#include<string>
输入/输出:cin / cout
迭代器访问:str.begin()+xxx / str.end()
字符串连接:str=str1+str2
字符串比较:str1 == / != / <= / < / > / >= str2 
字符串求长度:str.length()
字符串中插入字符/字符串:str.insert(pos号位置,字符串"xxx")
     / str.insert(str.begin()+xxx,str1.begin()+xxx,str1.end()+xxx)
字符串中删除:
      删除字符:str.erase(str.begin()+xxx)
 删除区间内字符串(包括端点):str.erase(str.begin()+xxx,str.end()-xxx)
             / str.erase(pos,length)  删除从pos(包括)位置开始的length个字符
清空字符串中的数据:str.clear()
返回字串:str.substr(pos,length 
         返回从pos号位(包括)开始长度为length的子串
查找子串:str.find(str1)  
         如果str1是str的字串返回其在str中第一次出现的位置
         否则返回string::npos         
    / str.find(str2,pos)
      如果从pos(包括)开始的str1是str的字串返回其在str中第一次出现的位置
      否则返回string::npos         

题目

A.字符串连接

不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。
输入
每一行包括两个字符串,长度不超过100。
输出
可能有多组测试数据,对于每组数据,
不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。输出连接后的字符串。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	char s1[105],s2[105],s[210];
	while(cin>>s1>>s2)
    {
    	int i=0,j=0;
    	while(s1[i]!='\0')
    	{
    		s[i]=s1[i];i++;
		}
			while(s2[j]!='\0')
    	{
    		s[i]=s2[j];i++;j++;
		}
		s[i]='\0'	;
	 cout<<s<<endl;
	 }
	return 0;
 } 

用惯各种库函数以后做这道看简单的题也并没有自己想象中的顺利。思想很简单,两个循环将两个字符串相连再放到另一个字符串中。但要注意不能用string,要用char数组,还要注意C++方式的多样例输入。

字符串结尾处一定要赋'\0'。

B.单词替换

输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入
多组数据。每组数据输入包括3行。第1行是包含多个单词的字符串 s,第2行是待替换的单词a,(长度<=100),第3行是a将被替换的单词b。(长度<=100)s, a, b 最前面和最后面都没有空格。
输出
每个测试数据输出只有 1 行,将s中所有a替换成b后的字符串。

#include<bits/stdc++.h>
using namespace std;
int main()
{
   char  s[1001];
   while(gets(s)!=NULL)
   {
       char a[1001], b[1001];
       char ans[1001][1001],r=0,c=0;
       for(int i=0;i<=strlen(s); i++)
       {

           if(s[i]!=' ')
               ans[r][c++] = s[i];
           if(s[i]==' '||i==strlen(s))
           {
               ans[r][c]='\0';
               r++;
               c=0;
           }
       }
       gets(a);
       gets(b);
       for(int i=0; i<r; i++)
       {
           if(strcmp(ans[i],a)==0)
                strcpy(ans[i],b);
                if (i==r-1)
                puts(ans[i]);
                else printf("%s ",ans[i]);
       }   
   }
   return 0;
}

这道题属于字符串基础题,直接求解即可,但需要掌握一些字符串输入输出的规则与值得注意的策略和方法。

1. puts(str)会在结尾输出'\n',printf("%s",str)不会换行。printf('%s\n',str)可以替换puts(str)。
2. scanf("%s",s)读入字符串,遇到空格就结束,故输入包含空格的字符串时,需要用 gets(s)。
3. 字符串多样例输入时通常以gets(s)输入换行为结束标志,即while(gets(s))。因为s是有空格的长字符串,所以时常利用s拆成一个一个的单词存到一个二维字符数组的行中,用二维数组存这个长字符串。
4. cin>>s遇到空格结束。若想读取有空格的字符串,可以使用cin.getline (s,N,'\n'),读N-1个字符或遇到换行结束。


C. 字符串去特定字符

输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。
输入
测试数据有多组,每组输入字符串s和字符c。
输出
对于每组输入,输出去除c字符后的结果。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	string str;
	char op;
	int pos,i;
	while(getline(cin,str)){
		cin.get(op);
		pos=0;
		while(1){
			pos=str.find(op);
			if(pos==-1)
				break;
			str.erase(str.begin()+pos);
		}
		cout <<str<<endl;
		getchar();
	}
	return 0;
}

这也是一道非常基础的题目,但是一直答案错误。原因就是不清楚用string时,多样例怎么输入,还有最后的输出问题,还有单个接收字符不能用cin。但根据这个代码开拓思路,可以利用find函数和erase函数进行循环不停删除相同字符或字符串。

string多样例输入要用getline(cin,str),单个字符输入要用cin.get(),cin输入会吞掉空格。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值