关于string类中间,母子字符串的搜索问题

 在新手初入c++时,string类是一大难点,其中有许多功能函数调用 

今天以一道字符串大小写的切换问题来说

给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

在这道题目中间需要用到函数string函数find,关于find的具体基本用法(首先,find是string类里面的函数,要用“.”):

find(string a),返回的是子字符串在母字符串第一个字符的位置,若无所查找的子字符串,则返回string::npos,关于他的具体介绍,以后会跟上了。

这道题关键是大小写的转换,对大小写敏感可以用find函数,对大小写不敏感,用cctype里面的tolower函数转换成小写,然后比较,最后输出原来的字符串


#include<iostream>
#include<cstring>
#include<cctype>
using namespace std;

int main(){
    string children;
    int kaiguan,line;
    cin>>children>>kaiguan>>line;
    string *zonestring=new string[line],*zonestring2=new string[line];
    for(int i=0;i<line;i++){
        cin>>zonestring[i];
        zonestring2[i]=zonestring[i];
    }
    if(kaiguan){
        for(int i=0;i<line;i++) if(zonestring[i].find(children)!=string::npos) cout<<zonestring[i]<<endl;
    }
    else{
        for(int i=0;i<children.size();i++) children[i]=tolower(children[i]);
        for(int i=0;i<line;i++) for(int i0=0;i0<zonestring[i].size();i0++) zonestring[i][i0]=tolower(zonestring[i][i0]);
        for(int i=0;i<line;i++) if(zonestring[i].find(children)!=string::npos) cout<<zonestring2[i]<<endl;
    }
    delete zonestring;
    return 0;
}



总的来说就是认识了string中间的的几个常用函数

1.size(),用来判断string的长度

2.find(a),用来搜索是否含有子字符串a

3.string中间的大小写转换函数tolower,toupper,在库cctype中间

此为c++复习篇

//

在此重新复习一下用char数组实现该题目,在题目中间,有时候会出现一些明显的字眼,如没有空格,只有字母,可能有些同学用char函数比较习惯

用char数组来实现此题更加方便


#include<iostream>
#include<cstring>
using namespace std;

int main(){
    char result[100];
    int kaiguan,line;
    cin>>result>>kaiguan>>line;
    char **zonechar=new char*[line],**zonechar2=new char*[line];
    for(int i=0;i<line;i++){
        zonechar[i]=new char[100];
        zonechar2[i]=new char[100];
        cin>>zonechar[i];
        strcpy(zonechar2[i],zonechar[i]);
    }
    if(kaiguan){
        for(int i=0;i<line;i++){
            if(strstr(zonechar[i],result)!=NULL) cout<<zonechar[i]<<endl;
        }
    }else{
        strlwr(result);
        for(int i=0;i<line;i++){
            strlwr(zonechar[i]);
        }
        for(int i=0;i<line;i++){
            if(strstr(zonechar[i],result)!=NULL) cout<<zonechar2[i]<<endl;
        }
    }
    delete[] zonechar;
    for(int i=0;i<line;i++) delete zonechar[i];
    return 0;
}


基本思路与用string相同,再次我们复习几个函数

1.strcpy:char数组的复制函数strcpy(*char a,*char b),将b复制到a,与一般的等号不同即a=b,等号只是将b的指针指到a,strcpy是完全复制

2.strlen:char数组的长度

3.strlwr:将大写转换成小写,此函数不是标准函数库,只能在vc中使用

4.strupr:将小写转换成大写,此函数也不是标准函数库,只能在vc中间使用

(ps:对于3,4,一些同学在oj系统使用时,可能会出现这两个函数未定义的情况,此是可以自行定义)

inline char* strlwr(char * a){

char * b=a;

for(;b!='\0';b++)   *b=*tolower(*a);

return  b;

}//参考百度百科关于strlwr的定义

今天就写到这里,下次再来加




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值