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

    xiaoxiao2025-01-14  8

    在新手初入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的定义

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

    转载请注明原文地址: https://ju.6miu.com/read-1295471.html
    最新回复(0)