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; }
文本文件例子如下:
执行过程即输出结果如下: