zoukankan      html  css  js  c++  java
  • C++string类字符串学习

    1.逆转字符串

    第一种,使用algorithm中reverse函数。

    #include <algorithm>
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        string s("abcdefghijklmnopqrstuvwxyz");
        reverse(s.begin(), s.end());
        cout<<s;
        system("pause");
    }

    第二种,使用string的insert()方法。insert()函数也可以换成push_back(),push_back()内部实现就是用的insert()

    #include <string>
    #include <iostream>
    using namespace std;
    
    void StrReverse(string &src, string &dst)
    {
        for (int i = 0; i < src.length(); i++)
        {
            dst.insert(dst.end(), src[src.length()-i-1]);
            //dst.push_back(src[src.length()-i-1]);
        }
    }
    
    int main()
    {
        string s("abcdefghijklmnopqrstuvwxyz");
        string dst;
        StrReverse(s, dst);
        cout<<dst<<endl;
        system("pause");
    return 0; }

    2.判断回文字符如 “wow"

    可直接使用上面的StrReverse()函数,然后判断 s == dst ? true:false

    3.修改题2中程序,使判断忽略大小写。

    #include <string>
    #include <iostream>
    using namespace std;
    
    void StrReverse(string &src, string &dst)
    {
        for (int i = 0; i < src.length(); i++)
        {
            src[src.length()-i-1] = tolower(src[src.length()-i-1]);//都转化为小写字母
            dst.insert(dst.end(), src[src.length()-i-1]);
            //dst.push_back(src[src.length()-i-1]);
        }
    }
    
    int main()
    {
        string s("CivIc");
        string dst;
        StrReverse(s, dst);
        cout<<"src:"<<s<<endl;
        cout<<"dst:"<<dst<<endl;
        cout<<(s == dst ? "true":"false")<<endl;
        system("pause");
        return 0;
    }

    4.修改题3 中程序,使其能够忽略标点符号和空格。例如"Able was I , ere I saw Elba."也报告true;

    #include <string>
    #include <iostream>
    using namespace std;
    
    //函数功能:删除所有非字母字符
    void DelBlank(string &src)
    {
        for (int i = 0; i < src.length(); i++)
        {
            if (src[i] < 'A' || (src[i] > 'Z' && src[i] < 'a') || src[i] > 'z')
            {
                src.erase(i, 1);//删除i位置开始的1个字符
                i--;//删除后当前位置需要再次进行判断
            }
        }
    }
    
    //函数功能:小写化和逆转字符串
    void StrReverse(string &src, string &dst)
    {
        for (int i = 0; i < src.length(); i++)
        {
            //都转化为小写字母
            src[src.length()-i-1] = tolower(src[src.length()-i-1]);
    
            dst.insert(dst.end(), src[src.length()-i-1]);
            //dst.push_back(src[src.length()-i-1]);
        }
    }
    
    int main()
    {
        string src("Able was I , ere I saw Elba.");
        string dst;
        DelBlank(src);
        StrReverse(src, dst);
        cout<<"src:"<<src<<endl;
        cout<<"dst:"<<dst<<endl;
        cout<<(src == dst ? "true":"false")<<endl;
        system("pause");
        return 0;
    }

    5.编写一个名为replace的程序,接受3个命令行参数,其中一个参数表示输入的文本文件;一个参数表示被替换掉的字符串(称为from);还有一个表示替换后的字符串(称为to)。此程序应该将一个新文件写到标准输出,并将所有的from被to代替的事件显示出来。

        这里生成在命令行执行程序,需要给main()函数带参数,关于main()函数参数,如下:

       

    #include <iostream>
    using namespace std;
    
    int main(int argc, char * argv[])
    {
        cout<<"argc:"<<argc<<endl;
        for (int i = 0 ; i < argc; i++)
        {
            cout<<"argv["<<i<<"]:"<<argv[i]<<endl;
        }
        return 0;
    }

    运行时,”开始“-命令行里输入cmd,进入命令框,用cd 命令进入到程序所在目录,找到Debug下程序,这里是ex3_1,执行时,输入程序名+任意个用空格隔开的字符串参数。回车执行。

    关于main()函数的参数,第一个是int 型的argc, 表示参数的个数,arg表示引数,参数,在计算机编程中常用,是argument的缩写。c表示counter,表示计数。第二个参数是char *数组,也可以写成char **argv,arg同样是参数,v表示vector,表示参数表。

    其中,第一个参数即argv[0]是程序名自身。后面才依次是执行时给它的参数。

    本题中程序要接收3个参数,第一个表示输入的文本文件,可以用写好的txt文件的路径+文件名,把文件放在程序同一个目录下即可以直接使用文件名,接下来的两个参数就是要替换的字符串和替换后的字符串,结果写到标准输出,那这里就是屏幕输出。还要将所有的替换事件写出来。

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    //替换函数:将context中所有from替换为to
    string & replaceAll(string& context, const string& from, const string& to)
    {
        size_t iBegin = 0;
        size_t iFound;
    
        string tmpStr;
        //给转化加上标记
        tmpStr = to+string("(converted)");
    
        while ( (iFound = context.find(from, iBegin)) != string::npos)
        {
            //从下标iFound开始替换from.size()长度,替换为tmpStr
            context.replace(iFound, from.size(), tmpStr);
            //查找下标后移to.size()
            iBegin = iFound + to.size();
        }
        return context;
    }
    
    int main(int argc, char * argv[])
    {
        //保证参数个数正确
        for (int i = 0 ; i < 4; i ++)
        {
            if (argv[i] == NULL)
            {
                cout<<"lack of argv!"<<endl;
                return 0;
            }
        }
    
        string strFrom,strTo;
        //要替换的字符串
        strFrom = argv[2];
        //替换后的字符串
        strTo = argv[3];
    
        ifstream InputFile(argv[1]);
        string srcStr;
        string tmpStr;
        string dstStr;
        //按整行读取,连接所有行,存在srcStr中
        while (getline(InputFile, tmpStr))
        {
            srcStr += tmpStr;
        }
        dstStr = replaceAll(srcStr, strFrom, strTo);    
        cout<<dstStr<<endl;
    
        return 0;
    }

    文本文件例子如下:

    执行过程即输出结果如下:

  • 相关阅读:
    Python开发入门与实战16-APACHE部署
    Python开发入门与实战15-IIS部署
    Python开发入门与实战14-基于Extjs的界面
    团队作业4:第三篇Scrum冲刺博客(歪瑞古德小队)
    团队作业4:第二篇Scrum冲刺博客(歪瑞古德小队)
    团队作业4:第一篇Scrum冲刺博客(歪瑞古德小队)
    团队作业4:项目冲刺集合贴(歪瑞古德小队)
    团队作业3:需求改进&系统设计(歪瑞古德小队)
    团队作业2:需求规格说明书(歪瑞古德小队)
    使用docker安装codimd,搭建你自己的在线协作markdown编辑器
  • 原文地址:https://www.cnblogs.com/fwst/p/3653496.html
Copyright © 2011-2022 走看看