3.2.1 定义和初始化

  • 直接初始化(direct initialization):直接调用对应的构造函数,对于string而言,不带“=”即为直接初始化,主要就是列表初始化(间2-2-1),可用圆括号或者大括号
  • 拷贝初始化(copy initialization):间接调用构造函数(一般是拷贝构造函数),对于string而言,带“=”即为拷贝初始化
  • 具体辨析

3.2.2 对string的操作

(一)重要操作一览

(二)读写操作

cin/cout

  • 读入cin>>s;遇到空格就停止读入
  • 输出cout<<s;
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1;
cin>>s1; //读入s1
cout<<s1; //输出s1
return 0;
}

当输入Hello World时,s1只读取到Hello,World在缓冲区没被读取,所以值输出Hello

getline : 可读取整行

基本语法

getline(cin, s);

  • 参数:输入流,字符串s
  • 副作用:
    • 读取输入流的一行,包括/n
    • 将内容去除/n存入字符串s
  • 返回值:输入流对象
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
getline(cin, s); //读入整行
cout<<s<<endl; //输出
return 0;
}

输入Hello World时,s全部读取,输出Hello World

注意

  • 如果一行的首字符就是/n,那么字符串s为空
  • 因为getline不读取换行符,所以在输出时一般加上<<endl进行换行并清空缓冲区

(三)获取大小 .size()

string s; unsigned int = s.size();

  • 是string类的一个成员函数

  • 返回字符串s的字符个数,类型是unsigned int【其实是string::size_type,但string::size_type底层就是unsigned int】

  • 避免unsigned int 与 int 混用

    string s = "hello";
    if(s.size() < -1) //该条件判断式永真,因为-1会转换为一个很大的unsigned int
    cout<<"in if statement"<<endl; int length = s.size();
    if(length < -1) //判断式为假,因为length是int类型
    cout<<"in if statement"<<endl;

(四)比较、赋值与增加

比较: ==

  • 参数:string 或 字符串字面量(string literals)
  • 副作用:按字典序比较
  • 返回值:返回比较结果,bool类型
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1 = "h";
string s2 = "h";
char s3[] = "h";
bool i = (s1 == s2); //比较s1与s2
bool j = (s1 == s3); //比较s1和s3
cout<<"i = "<<i<<endl; //输出 “i = 1”
cout<<"j = "<<j<<endl; //输出 “j = 1“
return 0;
}
    • string == string:比较内容
    • string == string literals:比较内容
    • string == char:不可比较
    • string literals == string literals:比较指针地址【比较内容要用strcmp()函数】

赋值: =

  • 参数:string对象 或 字符串字面量

  • 副作用:把string对象或字符串字面量的值赋值到另一个string中

  • 返回值:string对象

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
    string s1 = "h"; //把字符串字面量的值赋给s1
    string s2;
    s2 = s1; //把s1的值赋给s2
    cout<<s1<<endl; //输出 "h"
    return 0;
    }

增添: +

  • 参数:string对象 或 字符串字面量 或 字符字面量, 但是+的其中一个操作数必须是string对象

  • 副作用:生成一个新string对象,把+左边操作数的内容赋给生成的string对象,再把右边操作数的内容赋给string对象

  • 返回值:string对象的引用

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
    string s1 = "Hello";
    string s2 = "World";
    string s3 = s1 + s2; //链接s1,s2,把值赋给s3
    cout<<s3<<endl; //输出 “HelloWorld”
    return 0;
    }
  • 辨析:+`的其中一个操作数必须是string对象

    string s1 = "a";
    string s2 = s1 + "bc" + '\n'; //合法: 第一个+返回一个string对象,继续和'\n'相加【类似cin/cout链式法则】
    string s3 = "bc" + '\n' + s1; //不合法:第一个+两侧的操作数没有string对象。

3.2.3 对string中字符的操作

(一)处理string的所有字符

遍历的三种方式

  1. 迭代器(Iterator):暂略
  2. 范围for
  3. 下标与一般for

范围for

  • 语法

    for (declaration : expression) //expression:可遍历序列; declaration:expression基本元素的类型
    statement; //对每个元素执行的操作
  • 举例:输出string的每个字符

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
    string s = "hello world";
    for(auto c : s)
    cout<<c<<endl;
    return 0;
    }

cctype头文件

继承自c语言的ctype.h,但在c++最好写作cctype

  • isnum(c)

    • isalpha(c)

      • isupper(c) &&toupper(c)
      • islower(c)&&tolower(c)
    • isdigit(c)
  • ispunct(c)
  • isspace(c)

几个应用实例

  • 统计输入的字符串s中 标点符号的个数

    #include<iostream>
    #include<string>
    #include<cctype>
    using namespace std;
    int main(){
    string s = "Hello,,world!!!";
    int num = 0;
    for(char &c : s){
    if(ispunct(c))
    num++;
    }
    //输出 "the number of punctuation is 5"
    cout<<"the number of punctuation is "<<num<<endl;
    return 0;
    }
  • 将输入的字符串s中的 所有小写字母转为大写【注意使用引用!

    #include<iostream>
    #include<string>
    #include<cctype>
    using namespace std;
    int main(){
    string s = "Hello,,world!!!";
    for(char &c : s){
    if(islower(c))
    c = toupper(c);
    }
    //输出 “HELLO,,WORLD!!!”
    cout<<s<<endl;
    return 0;
    }

(二)处理string中的部分字符:下标(subscripts)

相关说明

  1. 可以使用下标直接访问并修改对应的字符值【随机访问并且可以直接修改s[inxdex] = 'n'

  2. 下标index的类型是 string::size_type,即unsigned int,但也可以被自动类型转换为int

  3. index范围: 0<= index < s.size()

用下标遍历

#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main(){
string s = "Hello world!!!";
for(decltype(s.size()) index = 0; index < s.size(); ++index) //index类型也可以直接写为int
cout<<s[index];
return 0;
}

引用实例:输出string s的第一个单词

以空格符号为分隔

#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main(){
string s = "Hello world!!!";
for(int index = 0; index != s.size() && !isspace(s[index]);
++index)
cout<<s[index];
//输出 “Hello”
return 0;
}

也可写作

#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main(){
string s = "Hello world!!!";
for(char c : s){
if(isspace(c)) break;
cout<<c;
}
//最终输出 "Hello"
return 0;
}

3-2 C++ string类型的更多相关文章

  1. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  2. 每日一记-mybatis碰到的疑惑:String类型可以传入多个参数吗

    碰到一个觉得很疑惑的问题,Mybatis的parameterType为String类型的时候,能够接收多个参数的吗? 背景 初学Mybatis的时候,看的教程和书籍上都是在说基本的数据类型如:int. ...

  3. C#string类型总结

    字符串的特性:不可变性,每对字符串做拼接或者重新赋值之类的操作,都会在内存中产生一个新的实例.  所以说,在.Net平台下,如果你对一个字符串进行大量的拼接赋值等操作,会产生大量的垃圾.    --- ...

  4. 把《c++ primer》读薄(3-1 标准库string类型初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...

  5. 【原创】Java和C#下String类型中的==和equals的原理与区别

    一.Java下 1.几个例子 public static void main(String[] arge) { String str1 = new String("1234"); ...

  6. String类型的属性和方法

    × 目录 [1]属性 [2]对象通用方法 [3]访问字符方法[4]字符串拼接[5]创建子串方法[6]大小写转换[7]查找子串位置[8]正则匹配方法[9]去除首尾空格[10]字符串比较 前面的话 前面已 ...

  7. String类型传值以及对象传值

    package Virtual; class Stan{ String mm = "hello"; } class Virtual { public static void mai ...

  8. java动手动脑和课后实验型问题String类型

    1.请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? true true false 总结: 使用new关键字创建字符串对象时, 每次申请 ...

  9. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  10. javascript类型系统——字符串String类型

    × 目录 [1]定义 [2]引号 [3]反斜线[4]特点[5]转字符串 前面的话 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串S ...

随机推荐

  1. kali常用配置

    用户须知 1.免责声明:本教程作者及相关参与人员对于任何直接或间接使用本教程内容而导致的任何形式的损失或损害,包括但不限于数据丢失.系统损坏.个人隐私泄露或经济损失等,不承担任何责任.所有使用本教程内 ...

  2. thymeleaf学习问题整理

    使用配置 <properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.9. ...

  3. LaTeX 魔法注释

    LaTeX magic comments,有点像 shebang,不过与 shebang 有细微区别,不要搞混. % !TeX root = main.tex % !TeX program = xel ...

  4. 用MySQL的GROUP_CONCAT函数轻松解决多表联查的聚合问题

    大家好呀,我是summo,最近遇到了一个功能需求,虽然也是CURD,但属于那种比较复杂一点的CURD,话不多说,我们先看一下需求. 需求如下: 有三张表,学生表.课程表.学生课程关联表,关联关系如下图 ...

  5. Kubernetes-9:Service介绍及演示

    Service Kubernetes 的Service定义了这样一种抽象:一个 Pod 的逻辑分组,一种可以访问他们的策略 -- 微服务,这一组Pod能够被Service访问到,通常是通过tabel ...

  6. TS中简单实现一下依赖注入

    依赖注入(Dependency Injection,DI)是一种设计模式,主要用于实现控制反转(Inversion of Control,IoC).它通过将对象的依赖关系从内部管理转移到外部容器来解耦 ...

  7. CCIA数安委等组织发布PIA星级标识名单,合合信息再次通过数据安全领域权威评估

    CCIA数安委等组织发布PIA星级标识名单,合合信息再次通过数据安全领域权威评估   近期,"中国网络安全产业联盟(CCIA)数据安全工作委员会"."数据安全共同体计划( ...

  8. html4,5 basic

    更新: 2021-06-15 游览器 href 和 base href 绝对路径和相对路径 在没有 base href 的情况下 href="/about.html" 就是从 do ...

  9. 内核模块踩内存问题定位利器- hardware breakpoint

    内核由于共享内存地址空间,如果没有合适的工具,很多踩内存的问题即使复现,也无法快速定位: 在新的内核版本中引入了一个新工具hardware breakpoint,其能够监视对指定的地址的特定类型(读/ ...

  10. OOP的核心思想

    1. 封装 既是信息封装,把一些信息进行封装成对象,只保留部分接口和方法与外部联系,能有效避免程序间相互依赖,实现代码模块间松藕合 : 2. 继承 子类自动继承父类的属性和方法,继承实现了代码的重用性 ...