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;
}

文本文件例子如下:

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

 

 

posted @ 2014-04-09 10:37  凤舞十天  阅读(370)  评论(0编辑  收藏  举报