c++ 标准库类型string

标准库类型string

string表示可变长的字符序列,使用string类型必须首先包含string头文件。

文章目录

  • 一、定义和初始化string对象
  • 二、操作string对象
  • 三、处理string对象中的字符

一、定义和初始化string对象

如何初始化类的对象是由类本身决定的。

1.拷贝初始化:

使用=初始化一个变量,编译器把等号右侧的初始值拷贝到新创建的对象中去。

2.直接初始化:不使用=

string s1;//s1是一个空串,该string对象中没有任何字符。
string s2(s1);
string s2 = s1;
string s3("value");
string s3 = "value";//这个字符串字面值,除了最后那个空字符以外,全部被拷贝到新建的s3对象中去。
string s4(n,'c');//string s4(6,'c');把s4初始化成,连续6个字符c组成的串。

二、操作string对象

类除了规定初始化其对象,还能够定义对象上能执行的方法。

类既可以通过函数名调用方法,也可以定义<<、+等各种运算符在该类对象上的新含义。

1.读写 string 对象

在使用cin执行读取操作时,string对象会忽略开头空白,从第一个字符开始,到下一个空白结束。

#include<iostream>
#include<string> 
using namespace std;
int main(){string s;cin>>s;cout<<s<<endl;return 0;
} 
//输入:   hello world
//输出:hello

2.读取未知数量的 string 对象

string word;
while(cin >> word)//没遇到文件结束标记或者非法输入,一直读取cout << word << endl;

3.使用 getline 读取一整行

如果说在最终字符串中保留输入时的空白,使用getline函数替代>>。

函数从给定的输入流中读取数据,直到遇到换行符为止(换行符也被读进来了),然后把所读的内容存放在string对象里(这里面不存在换行符)。

如果输入一开始就是个换行符,那么所得结果是一个空string。

string line;
getline(cin, line);
cout << line << endl;
//getline返回它的流参数,我们也能把getline的结果作为条件。
while(getline(cin, line))//每次读一整行,直到文件末尾。cout << line << endl;

4.string 的 empty 和 size 操作:

empty是string的一个成员函数,使用点操作符指明是那个对象执行了 empty 函数即可。

s.empty()s为空返回true,否则返回false。

while (getline(cin, line))//只输出非空的行if(!line.empty())//如果line不为空则返回真。cout << line << endl;

size函数返回string对象的长度(字符的个数)。

while (getline(cin, line))//只输出超过80个字符的行if(line.size() > 80)cout << line << endl;

size函数返回的是string::size_type类型的值,它是一个无符号类型的值,而且能够存放下任何string对象的大小。

string s;
cin>>s;
auto len = s.size();//c++11允许通过auto来推断变量类型
cout << len;

5.字符串字面值和string是不同的类型。

使用+运算符,必须确保每个+的两侧的运算对象至少有一个是string。

//字面值和string对象相加:
string s4 = s1 + ",";//正确
string s5 = "hello" + ",";//错误
string s6 = (s1 + ",") + "world";//正确,对string对象使用+运算符得到一个新的string对象。

三、处理string对象中的字符

1.使用 范围for(range for)语句处理每个字符

范围for语句:遍历给定序列中的每个元素并对序列中的每个值执行某种操作。

//语法形式:
for (declaration : experssion)statement
/*
experssion: 一个对象,用于表示一个序列。
declaration: 定义一个变量,该变量用于访问序列中的基础元素。
statement: 对每个元素的操作。
*/
string str("some words");
for (auto c : str)//对于str中的每一个字符。每次迭代,str的下一个字符被拷贝给c。cout << c << endl;//输出当前字符并加一个换行符。

改变某个字符的特性,利用cctype头文件中的函数,进行相应判断:

isdigit(c);//c是数字时为真。
isalpha(c);//c是字母时为真。
ispunct(c);//c是标点符号时为真,即c不是控制字符、数字、字母、可打印空白中的一种。
toupper(c);//如果c是小写字母,输出对应的大写字母,否则原样输出c。
...
//还有很多,请查手册。
string s("HELLO WORLD!!!");
decltype(s.size()) punct_cnt = 0;//punct_cnt类型和s.size类型相同。
for (auto c : s)if (ispunct(c))//对于s中每个字符,如果该字符是标点符号,将标点符号计数值加一。++punct_cnt;
cout << punct_cnt<< " punctuation characters in " << s << endl;

2.使用 范围for 语句改变字符串中的字符

把循环变量定义成引用类型即可,使用引用作为循环控制变量时,这个变量被依次绑定到了序列的每个元素上。

string s("Hello World!!");
for(auto &c : s)c = toupper(c);//c是一个引用,因此赋值语句将改变s中字符的值。
cout << s << endl;//输出:HELLO WORLD

3.只处理一部分字符

访问string 对象的单个字符有两种方式,一种是用下标,另一种是用迭代器。这里先介绍通过下标的方法。

  • string对象的下标必须>=0 而且 <s.size()。
  • 如果下标是带符号类型的值,将自动转换成由 string::size_type 表达的无符号类型。
  • 下标运算符[]接收的输入参数是 string::size_type 类型的值,这个参数表示要访问的字符的位置,返回值是该位置上字符的引用。
  • 不管什么时候只要对string对象使用了下标,都要确认在那个位置上确实有值。
if (!s.empty())//在访问指定字符之前,首先检查s是否为空。如果s为空,则s[0]的结果将是未定义的。cout << s[0] << endl;string s("some string");
if (!s.empty())s[0] = toupper(s[0]);//将字符串首字母变成大写。
//只要字符串不是常量,就能为下标运算符返回的字符赋新值。

4.使用下标执行迭代:

for (decltype(s.size()) index = 0;index !=s.size() && != isspace(s[index]); ++index)s[index] = toupper(s[index]);
//依次处理s中的字符,直至我们处理完全部字符或者遇到一个空白
//如果s是some thing,经过操作,s变成SOME thing

这里使用了:index !=s.size() && != isspace(s[index])

c++语言规定,只有左侧运算对象为真,才会检查右侧运算对象。因此只有在index达到s.size()之前,才会执行s[index],这样确保index比s.size()小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php防止跨域提交,PHP防止跨域提交表单的简单示例

这篇文章主要为大家详细介绍了PHP防止跨域提交表单的简单示例&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。感兴趣的小伙伴&#xff0c;下面一起跟随512笔记的小玲来看看吧&#xff01;在写用户注册的时候,一定要主要你的表单是否可以跨域提交.php中解决的方法…

php李捷,【问题解答】蝶泳手外划的作用

一直以来总是弄不明白&#xff0c;蝶泳手外划的作用&#xff0c;以及正确的外划动作&#xff0c;请指教。”我&#xff1a;先上两个图&#xff0c;您自己分析一下&#xff1a;我&#xff1a;蝶泳的划手路线和打腿的幅度和力度是相匹配的&#xff0c;如果打腿幅度小频率快&#…

php三维数组转换二维数组,php 三维数组转二维数组(多维数组变合拼二维数组)(foreach循环 数组叠加)...

/**************** function 三维数组转二维数组* Param: $array : 传入参数* Return: $tempArr 返回结果数组***************/function array3_to_array2($array){$array array_filter($array);$array array_values($array);foreach ($array as $orderKey >$orderVal){$c…

php ip2long bug,PHP代码ip2long 循环有关问题

PHP代码ip2long 循环问题print_r($dataIp);foreach ($dataIp as $key>$value) {$data[ip] $value;$data[iplong] bindec(decbin(ip2long($value)));print_r($data);}打印出来的结果为&#xff1a;引用Array([0] > 208.104.70.215[1] > 74.101.176.171[2…

Java 抽象类和抽象方法

Java 抽象类和抽象方法 抽象类是它的所有子类的公共属性的集合&#xff0c;是包含一个或多个抽象方法的类。使用抽象类可以充分利用这些公共属性来提高开发和维护程序的效率。抽象方法必须为public或protected。&#xff08;因为如果是private&#xff0c;则不能被子类继承&am…

ltrim函数php,php ltrim函数怎么用?

php ltrim()函数用于删除字符串左边的空格或其他预定义字符&#xff0c;语法为“ltrim(string,charlist)”&#xff0c;参数string指定需要处理的字符串&#xff0c;参数charlist指定要从字符串中删除哪些字符&#xff1b;然后返回已修改的字符串。php ltrim函数作用&#xff1…

php免费根据ip查城市,根据ip获取城市的方法

这个方法放到includes/lib_base.php的最下面/*** 根据ip获取城市的方法* param type $ip ip地址* return boolean|string**/function GetIpLookup($ip ){if(empty($ip)){return 请输入IP地址;}$res file_get_contents(http://int.dpool.sina.com.cn/iplookup/iplookup.php?f…

java strcpy,详解C语言中strcpy()函数与strncpy()函数的使用

C语言strcpy()函数&#xff1a;复制字符串头文件&#xff1a;#include 定义函数&#xff1a;char *strcpy(char *dest, const char *src);函数说明&#xff1a;strcpy()会将参数src 字符串拷贝至参数dest 所指的地址。返回值&#xff1a;返回参数dest 的字符串起始地址。附加说…

使用github+hexo搭建静态blog

解决了个人博客图片不显示问题。解决了打开页面产生404问题。学习了如何更换界面主题。学习了如何使用Git。 注&#xff1a;这篇文章仅仅是入个门&#xff0c;了解一下怎么使用githubhexo创个静态blog&#xff0c;具体blog细节比如个人介绍&#xff0c;评论插件&#xff0c;音…

java 安卓调试,Android Studio(二十一):调试你的应用

Android Studio包含了一个调试器&#xff0c;允许你调试运行在Android虚拟机或连接的Android设备的应用。通过Android Studio的调试器&#xff0c;你可以&#xff1a;1、 选择你调试设备的app2、 为你的代码设置断点3、 在运行时检测变量和表达式4、 截图和录像通过点击工具栏中…

java将属性练成字符串,Java中通过属性字符串名取属性内容

在Android开发当中资源的获取其实是间接通过R文件进行的,这个R文件就相当于是一个地址列表,存放着每个资源的地址那么如何快速高效的获取就是这篇文章要分析的问题假设我们有一个图片资源叫btn_bg那么将一个按钮背景设置为这个图片的方式就是btn.setBackgroundResource(R.drawa…

AttributeError: module ‘numpy‘ has no attribute ‘int‘.

解决方法 降低numpy版本 numpy 1.22 修改源代码 参考 [1] 【已解决】AttributeError: module ‘numpy‘ has no attribute ‘int‘. [2] AttributeError: module numpy has no attribute int .报错解决方案

Java字段和属性

属性和字段区别&#xff1a; Java中的属性(property)&#xff0c;通常可以理解为get和set方法。更形象的说就是&#xff1a;属性是对字段的封装&#xff0c;供外部访问。 而字段(field)&#xff0c;通常叫做“类成员”&#xff0c;或 "类成员变量”&#xff0c;有时也叫“…

java我现在不懂看不懂,看都看不懂,难道我与Java无缘吗

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package VIP;public class Hero {private String name;private int Life;public void hero(String name,int Life){}public String getName() {return name;}public void setName(String name) {this.name name;}public int getLi…

Java反射 Class类

Class类的实例表示正在运行的Java应用程序中的类和接口。它是Java反射的基础&#xff0c;对任何一个类&#xff0c;首先产生一个Class对象&#xff0c;然后才通过class类获得其他的信息。 获取class类对象方式&#xff1a; 通过Object类提供的getClass()方法获得Class类对象。…

php数字从大到小生成,php输入几个数从大到小排序的案例

php输入几个数从大到小排序的案例发布时间&#xff1a;2020-10-28 11:53:20来源&#xff1a;亿速云阅读&#xff1a;66作者&#xff1a;小新php输入几个数从大到小排序的案例&#xff1f;这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小…

Java反射 Constructor类

Java反射 Constructor类 Java通过反射可以获取构造方法&#xff0c;和使用构造方法创造对象。 在网上找了一个比较好理解的例子来弄清楚Constructor类。 public Constructor getConstructor()// 公共构造方法对象 public Constructor[] getConstructors()//所有公共构造方法…

mysql hammerdb,[料理佳餚] 用 HammerDB 來執行資料庫 TPC-C 效能量測

TPC-C 模擬的情境TPC-C 模擬的情境是一個大型的商品批發商&#xff0c;擁有若干個倉庫&#xff0c;每個倉庫擁有 100000 件商品庫存、負責為 10 個地區供貨&#xff0c;每個地區服務 3000 名客戶&#xff0c;每名客戶平均一筆訂單有 10 項商品&#xff0c;所有訂單中約 1% 在其…

使用Linux进行c或c++编程

使用Linux进行C或c语言编程 1.创建名为 HelloWorld 的 c 或者 c 文件 vim HelloWorld.c vim Helloworld.cpp2.然后就进入文本编辑界面 输入i&#xff0c;进入编辑模式。写代码。按esc键&#xff0c;进入命令模式&#xff0c;输入:wq保存并退出文本编辑器。然后可以看见对应位…

如何用php写表单中的年月日,php写的日历程序 - adamboy的个人页面 - OSCHINA - 中文开源技术交流社区...

$weekArr array(Sun,Mon,Tue,Wed,Thu,Fri,Sat);//获取空格&#xff1a;//echo date("D",strtotime("2012-02-07"));function getSpace($month,$year){global $weekArr;if(!$year){$year date("Y");}$firstDay date("D",strtotime($…