#include <string>
#include <iostream>
#include <cstring>
#include <algorithm> using namespace std; int to_lower(int c)
{
if (isupper(c))
{
return (c+);
} return c;
} int to_upper(int c)
{
if(isupper(c))
{
return (c-);
}
return c;
} int main()
{
// 初始化string
string s1="ACM"; string s2("ACM"); string s3=s2; //string s4(10,"ACM");
string s4(,'A');
// 第四种初始化方式,只能初始化单个字符 cout<<s1<<endl;
cout<<s2<<endl;
cout<<s3<<endl;
cout<<s4<<endl; cout<<"数组方式遍历:"<<endl;
// 遍历string
for(int i=;i<=s1.length()+;++i)
{
cout<<s1[i];
}
cout<<endl;
// 用数组方式遍历,越界时,不会发生错误,不会抛出异常 cout<<"at:"<<endl;
// at方式遍历
for(int i=;i<s1.length();++i)
{
cout<<s1.at(i);
}
cout<<endl;
// 抛出异常
// 将上述循环中,循环终止条件小于改为小于等于异常如下:
// ACM 烐GACMterminate called after throwing an instance of 'std::out_of_range'
//what(): basic_string::at // 迭代器遍历
cout<<"迭代器遍历:"<<endl;
for(string::iterator it=s1.begin();it!=s1.end();++it)
{
cout<<*it;
}
cout<<endl;
// 上述string::iterator迭代器可以看作是一个字符指针
// 注意,s1.end()不是指向字符的最后一个位置,而是指向字符最后一个位置后面的一个位置 // C_str 将string转化为const char *
//char *p=s1.c_str();
// 以上代码报错如下
//F:\acm\训练日记\2020.1.27\program\t15.cpp|62|error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|
// 可见c_str()将string类型转化为了const char *
const char *s=s1.c_str();
cout<<endl<<"s:"<<endl;
cout<<s<<endl<<endl;
// 可以直接用const char *赋值给string
string s5=s;
cout<<"s5:"<<endl;
cout<<s5<<endl;
// 也可以直接用char *赋值给string类型,方便好用
char *p="heiheihaha";
string s6=p;
cout<<"s6:"<<s6<<endl;
// 其实这也是属于上述构造构造函数的范畴 // copy(buf,size,begin) 将begin开始的size个字符,拷贝到buf中,不会在buf的末尾,加额外的'\0'
// 注意越界问题,越界不会抛出异常
char buf[];
s1.copy(buf,,);
cout<<"buf"<<endl;
cout<<buf<<endl;
//string buf2;
//s1.copy(buf2,2,0);
//cout<<"buf2:"<<buf2<<endl;
// 以上代码是错误的,buf必须为char*类型,不能是string类型 // 如下方法拼接,不改变s1
string s7=s1+s2;
cout<<"s1: "<<s1<<endl;
cout<<"s2: "<<s2<<endl;
cout<<"s7: "<<s7<<endl;
cout<<endl; // 如下方法拼接,已改变s1
string s8=s1.append(s2);
cout<<"s1:"<<s1<<endl;
cout<<"s2:"<<s2<<endl;
cout<<"s8:"<<s8<<endl;
cout<<endl; // 如不想改变的话,也可以
string s9;
s9.append(s1);
s9.append(s2);
cout<<"s1:"<<s1<<endl;
cout<<"s2:"<<s2<<endl;
cout<<"s9:"<<s9<<endl;
cout<<endl; // find
int index=s1.find("ACM");
cout<<index<<endl;
// 第二个参数不写,默认为0
cout<<s1.find("ACM",)<<endl;
cout<<s1.find("ACM",)<<endl;
// 返回第二个ACM出现的位置 cout<<s9<<endl;
// 返回第一次出现ACM的首字符A的位置
cout<<s9.find_first_of("ACM")<<endl;
// 返回最后一次出现ACM的末尾字符M的位置
cout<<s9.find_last_of("ACM")<<endl;
// 以上下标,都是从0开始的 // 如果没有找到会返回什么呢?
size_t num=string::npos;
int num1=num;
cout<<s9.find("ACMER")<<endl;
cout<<string::npos<<endl;
cout<<num<<endl;
// 你可能很奇怪上述输出的值,让我们看看用int类型来输出
cout<<num1<<endl;
unsigned int num2=num;
cout<<num2<<endl;
// 实际上,这是个-1
// 只是因为用了较大范围的类型(不准确,其实范围一样,只是将负数部分正数编码了),才变成了那个很大的值 // 试试将字符串中某一字符串替换成另一字符串
cout<<"s9:"<<s9<<endl;
int cur_index=s9.find("ACM");
while(cur_index != string::npos)
{
s9.replace(cur_index,strlen("ACM"),"ACMER"); // 注意strlen函数要有头文件cstring
// 这一步保证了如果新字符串中存在当前字符时,不会重复替换,甚至陷入死循环
// 从已经被替换的字符串后面开始
cur_index+=strlen("ACMER");
cur_index=s9.find("ACM",cur_index);
}
cout<<"s9:"<<s9<<endl;
// replace,第一个参数为起始位置,第二个参数为要替换的字符串有多少个字符,第三个参数为新字符串 // 最后,是插入和删除操作 cout<<"s1:"<<s1<<endl;
//string::iterator it=find(s1.begin(),s1.end(),'a');
//F:\acm\训练日记\2020.1.27\program\t15.cpp|163|error: no matching function for call to 'find(std::basic_string<char>::iterator, std::basic_string<char>::iterator, char)'|
// 网上的一些字符串函数,我这里好像不能用
// 暂时不知道原因,留作疑问,继续深入学习
//cout<<*it<<endl;
s1.erase(s1.begin(),s1.begin()+);
cout<<s1<<endl;
s1.insert(,"ACMER");
cout<<s1<<endl; // 大小写转换
transform(s1.begin(),s1.end(),s1.begin(),to_lower);
cout<<s1<<endl;
transform(s1.begin(),s1.end(),s1.begin(),to_upper);
cout<<s1<<endl;
// 嗯?原来还要自己写to_lower和to_upper吗?
// 可能为了灵活些
// 毕竟是transfor,转化是任意的,大家可以多尝试尝试
// string的基本内容,大概就这么多了,学一下,之后用起来方便点 return ;
} // 本机执行结果如下,由于前面尝试越界,比较危险,可能引发各种问题
// 不过问题不大
/*
ACM
ACM
ACM
AAAAAAAAAA
数组方式遍历:
ACM 狍颈
at:
ACM
迭代器遍历:
ACM s:
ACM s5:
ACM
s6:heiheihaha
buf
ACM
s1: ACM
s2: ACM
s7: ACMACM s1:ACMACM
s2:ACM
s8:ACMACM s1:ACMACM
s2:ACM
s9:ACMACMACM 0
0
3
ACMACMACM
0
8
4294967295
4294967295
4294967295
-1
4294967295
s9:ACMACMACM
s9:ACMERACMERACMER
s1:ACMACM
ACM
ACMERACM
acmeracm
acmeracm Process returned 0 (0x0) execution time : 0.608 s
Press any key to continue.
*/

最新文章

  1. WCF学习之旅—WCF概述(四)
  2. php文件扩展名判断
  3. linux(centos)用户与权限
  4. 搞明白这八个问题,Linux系统就好学多了
  5. java 500/404错误总结
  6. Java 第六章 循环结构2
  7. 【SpringMVC】SpringMVC系列9之Model数据返回到View
  8. windows的定时任务设置
  9. JSP 获得Spring 注射对象
  10. Jasmine 的自定义部分
  11. day 10 字符编码和文件处理 细节整理
  12. C# linq语句学习
  13. snap7和plc的IP设置问题
  14. https SSL主流数字证书都有哪些格式(转载)
  15. MVC架构介绍-序列化属性
  16. 设计模式之迭代器模式(Iterator)
  17. Centos7.2安装搜狗拼音
  18. MySQL重复数据处理
  19. 概率论基础教程 (Sheldon M. Ross 著)
  20. Mysql权限速查表以及权限详解

热门文章

  1. Codeforces 922 E Birds (背包dp)被define坑了的一题
  2. Codeforces 1011C Fly(二分+模拟)
  3. Codevs 1205 单词反转(Vector以及如何输出string)
  4. MySQL8.0关系数据库基础教程(三)-select语句详解
  5. 快速下载Keil μVision MDK-Arm包
  6. 031.Python类中的方法
  7. js - 面向对象 - 小案例:轮播图、随机点名、选项卡、鼠标拖拽
  8. 2Nginx+keepalive+2tomcat 故障转移
  9. 在Linux实例上自动安装并运行VNC Server
  10. [LeetCode] [链表] 相关题目总结