你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

3.5.2 字符串类型

使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的。很自然地,一种最简单直接的方法就是利用数组(一种数据组织管理方式,它将多个相同类型的数据元素组 织起来,形成一个数据序列以便于访问。更多可以参考后文3.6小节对数组的介绍)来保存一个字符串中的各个字符,最后用一个特殊字符‘\0’表示字符串的 结束,以此来将多个char类型的字符数据串联成字符串。例如:


 

// 定义一个字符数组,用以保存字符串
char msg[32];
// 将各个字符依次保存到数组相应位置上
msg[0] = 'G';  // 第一个字符,保存到数组的第一个位置,后面的以此类推
msg[1] = 'o';
msg[2] = 'o';
msg[3] = 'd';
// 在最后的位置保存一个‘\0’,表示字符串结束
msg[4] = '\0';
// 输出msg数组中的字符串
cout<<msg<<endl;

用字符数组表示字符串的方式虽然简单可行,可是却有诸多使用上的不便。在C++中,我们更多地是用STL(Standard Template Library,标准模板库,是利用模板技术实现的一套函数库,其中提供了一些常用的容器和算法以便于对数据进行处理。这里的字符串类型 string就是由它定义的一种用以表示字符串的数据类型。关于STL,在稍后的第8章中我们还将详细介绍)中定义好的字符串类型string来表示字符 串。这种字符串类型实质上是对一个char类型字符数组的包装,在保存字符串数据的同时还增加了一些对字符串的常用操作,比如获取字符串长度,查找特定字 符等,这样字符串的处理就方便多了。就像char和wchar_t相互对应处理不同范围的字符一样,与string对应的,C++还提供了可以处理 wchar_t类型字符的wstring字符串类型。例如:


 

#include <iostream>
#include <string>   // string类型所在的头文件using namespace std;int main()
{// 定义一个string类型变量,表示英文字符串string strEn = "Good Morning!";// 定义一个wstring类型变量,表示中文字符串wstring strChs = L"陕A-82103";// 用cout输出string类型字符串// 用wcout输出wstring类型字符串cout<<strEn;wcout.imbue( locale ( "chs" ) ); // 设置区域wcout<<strChs<<endl;return 0;
}

可以看到,因为string和wstring编码方式的不同,不同的字符串在输出的时候需要采用不同的方式。对于wstring类型的字符串变量, 在输出的时候需要使用wcout对象,并且需要用imbue()函数设定字符的编码方式。另外,这里值得指出的一点是,英文字符串不仅可以用string 类型表示,也可以使用wstring类型表示,而中文字符串则只能使用wstring类型表示。

string类型不仅包装了字符数组,可以存储字符串中的各个字符,同时还提供了很多跟字符串相关的操作,例如,可以获得一个字符串的长度,或者在字符串中查找某个字符等等,极大地方便了对字符串的处理。例如:


 

// 定义一个字符串变量,用于保存用户输入的用户名
string strName = "";cout<<"请输入用户名:"<<endl;
// 获取用户输入的字符串,并保存到strName变量  
cin>>strName;
// 通过string类型的length()函数获取strName的长度
// 并判断其长度是否小于6(字符串中是否少于6个字符)
if(strName.length() < 6)
{// 如果小于,则进行错误提示cout<<"错误:用户名至少包含6个字符"<<endl;
}

在上面这段代码中,我们首先定义了一个string类型的变量strName,用以保存用户输入的用户名字符串,然后用cin获取用户输入的字符串 并保存到strName变量。接着再利用string类型的length()函数获取字符串的长度,也就是strName中的字符个数。最后用if条件结 构将其与我们要求的字符串长度6进行比较,如果不符合条件则进行错误提示。

知道更多:auto类型变量——根据初始值推断真实的数据类型

在前面的章节中,我们介绍了C++中的多种数据类型:有表示整数的int类型也有表示浮点数的float类型;有表示单个字符的char类型也有表 示字符串的string类型,这些意义不同用途各异的数据类型为我们定义变量来表示现实世界中的数据提供了丰富的选择。但是,这些数据类型在使用上有一个 共同的要求,那就是在定义变量表示数据时,我们必须先要知道所要表示的数据是什么类型,到底是一个小数呢还是一串字符,然后才能据此确定到底是该使用 float呢还是string。可是在开发实践中,有时候我们并不能非常容易地确定一个变量应该具有的数据类型。比如,将某个复杂表达式作为初始值赋值给 一个新定义的变量时,我们往往很难确定这个表达式的数据类型,从而无法确定变量应有的数据类型。为了解决这个问题,C++11为我们提供了auto关键 字,使用它作为某个变量定义的数据类型,编译器会根据这个变量的初始值,自动推断出这个变量合理的数据类型而无需我们人为指定。例如:


 

auto x = 7;      // 使用整数7对变量x进行初始化,x被推断为int类型
auto y = 1.982;  // 使用浮点数1.982对变量y进行初始化,y被推断为double类型Handler GetHandler();
// 使用GetHandler()函数的返回值对变量handler进行初始化
// handler被推断为Handler类型
auto handler = GetHandler();

这里我们在定义变量x的时候,并没有指定其具体的数据类型,而是使用auto做为代替。这样,编译器在编译这段代码时,会根据7这个初始值自动推断 x的实际数据类型为int。同样的道理,使用浮点数1.982进行初始化的变量y会被编译器自动推断为double类型;而最后的一个变量handler 会被初始化为GetHandler()函数的返回值类型Handler。虽然auto关键字会根据初始值自动推断变量的数据类型,但是,它的使用并不需要 花费额外的编译时间。有好处而又没有额外的花费,auto关键字就像商场的免费大赠送,这样的大便宜谁不喜欢呢?

实际上,可以把auto关键字看成是一个变量定义中的数据类型占位符,它占据了原来应该是具体数据类型的位置。而在编译的时候,编译器会根据这个变 量的初始值,推断出这个变量应有的具体数据类型,然后替换掉auto关键字,就成为一个普通的带有具体数据类型的变量定义了。用auto关键字定义变量的 形式跟一般的定义变量的形式并无二异,唯一的差别之处在于,用auto关键字定义变量时,变量必须有初始值:

auto 变量名 = 初始值表达式;  // 赋值形式
// 或
auto 变量名{初始值表达式}; // 初始化列表形式

这样,这个初始值表达式计算结果的数据类型将被编译器推断为变量的数据类型。

通常在定义变量时,如果我们很难准确地推断它的数据类型,或者是这个变量的数据类型难于书写,就可以使用auto作为变量的数据类型来定义变量,而 真正的数据类型就交由编译器去根据变量的初始值推断得到好了。做这种苦力活,电脑要比人脑快多了。这样做不仅省去了我们自己推断数据类型的麻烦,避免了可 能的人为错误,同时也可以达到简化代码的目的。例如:


 

template <typename T>
// 数据类型vector<T>之后的“&”符号,表示其后所定义的变量是一个引用
// 引用是C++中一种访问数据的特殊方式,在稍后的7.1小节中我们将详细介绍
void printall(const vector<T>& v)
{// 根据v.begin()的返回值类型自动推断变量it的数据类型for (auto it = v.begin(); it != v.end(); ++it)cout << *it << endl;
}  

为了表示同样的意义,如果没有auto关键字帮忙,我们不得不写成下面这种繁琐的形式:


 

template <typename T>
void printall(const vector<T>& v)
{for (typename vector<T>::const_iterator it = v.begin();it != v.end(); ++it)cout << *it << endl;
}

除了简化代码之外,auto关键字有时候甚至能够帮助我们完成一些在C++11之前不可能完成的任务,成为一种必需。比如,在模板函数中,当一个变 量的数据类型依赖于模板参数时,如果不使用auto关键字,将根本无法确定变量的数据类型,因为我们根本无法提前预知用户使用何种数据类型作为模板参数来 调用这个模板函数,从而也就无法确定这个变量的数据类型。但是使用auto关键字之后,一切难题都将迎刃而解。例如:


 

template <typename T,typename U>
void mul(const T& t,const U& u)
{// ...// 用auto关键字做数据类型,编译器将根据u和t的实际数据类型,// 自动推断变量tmp的数据类型auto tmp = t*u;// ...
}

在这里,变量tmp的数据类型应该与模板参数T和U相乘结果的数据类型相同,也就是依赖于T和U的数据类型。对于程序员来说,在编写这个模板函数的 时候,模板参数T和U的类型尚未确定,这样变量tmp的类型也就无法确定。所以,我们用auto关键字作为占位符,占据数据类型的位置,而真正的数据类 型,则留待编译器在最终编译的时候,根据具体给定的模板参数T和U的类型而推断得到。这样,就把一件原来不可能的事情变成了可能。

使用auto关键字,可以根据变量的初始值自动推断其数据类型,这样就极大地方便了复杂数据类型变量的定义。但是,这种方式好是好,却有一个缺点, 那就是每次推断得到的数据类型只能在定义变量的时候使用一次,无法保留下来继续使用。好不容易推断得到的数据类型只能使用一次,这就显得有点不够低碳环保 了。而有时候,我们也需要这个推断得到的数据能够保留下来,从而可以重复使用以定义相同类型的多个变量。为了弥补这个缺点,C++11还提供了一个 decltype关键字。它的使用语法形式如下:

typedef decltype(表达式) 用户数据类型;

其中,decltype(表达式)是这个表达式的推断数据类型(declared type),也就是这个表达式计算结果的数据类型。而typedef则是将这个数据类型定义为用户自定义的数据类型,换句话说,也就是为这个推断数据类型 取一个名字,从而可以把它作为一个新的数据类型,用在定义变量、创建对象等任何需要数据类型的地方。例如,我们可以用decltype关键字改写上面的例 子:


 

template <typename T,typename U>
void mul(const T& t,const U& u)
{// ...// 用decltype得到t*u的数据类型,// 并用typedef关键字将其定义成一个新的数据类型Mtypedef decltype(t*u) M;// 用这个新的数据类型M定义指针变量(表示变量或函数地址的变量),创建M类型对象M* tmp = nullptr;tmp = new M;     // ...
}

auto和decltype的作用有些相似,都可以推断某个表达式的具体数据类型。但是,两者的使用还是稍有差别。如果我们仅仅是想根据初始值确定 一个变量合适的数据类型,那么auto是最佳人选。而只有当我们需要推断某个表达式的数据类型,并将其作为一种新的数据类型重复使用(比如,定义多个相同 类型变量)或者单独使用(比如,作为函数的返回值类型)时,我们才真正需要用到decltype。

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

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

相关文章

蓝牙BLE学习-蓝牙广播

1.概念 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…

C语言——oj刷题——模拟实现库函数strlen

目录 方法一&#xff1a;迭代法 方法二&#xff1a;递归法 方法三&#xff1a;指针算术法 方法四&#xff1a;汇编指令法 当我们使用C语言进行字符串操作时&#xff0c;经常会用到库函数strlen来获取字符串的长度。strlen函数的作用是计算一个以null字符结尾的字符串的长度…

六、java高级-泛型(一)

六、泛型 1、泛型 从什么是泛型、泛型从何而来、泛型出现是为了解决什么问题、功能及作用说泛型 1.1什么是泛型&#xff1f; 泛型&#xff1a;即“参数化类型”&#xff0c;也就是将需要操作对象的类型进行参数化。在编写代码的时候&#xff0c;不必声明操作对象&#xff08;…

docker从入门到入土

docker到底是什么&#xff1f; docker是世界领先的软件容器平台&#xff0c;基于GO语言进行开发实现docker能够自动执行重复性任务&#xff0c;例如搭建和配置开发环境&#xff0c;从而解放开发人员用户可以方便地创建和使用容器&#xff0c;把自己的应用放入容器&#xff0c;…

基于Robei EDA--实现串口通信

一、串口简介 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#xff0c;在设计众多通信接口和调试时占有重要地位。但UART和SPI、IIC不同的是&#xff0c;它是异步通信接口&#xff0c;异步通信中的接收方并不知道数据什么时候会到达&#xff0c;所…

int VS Integer

在Java中&#xff0c;int 是一种基本数据类型&#xff08;primitive type&#xff09;&#xff0c;而 Integer 是 int 的包装类&#xff08;wrapper class&#xff09;。它们之间的主要区别在于以下几点&#xff1a; 数据类型&#xff1a;int 是基本的整数类型&#xff0c;它在…

Linux gzip命令教程:如何有效地压缩和解压文件(附实例详解和注意事项)

Linux gzip命令介绍 gzip&#xff08;GNU zip&#xff09;是一种在Linux系统中常见的命令行压缩工具。它使用DEFLATE压缩算法来减小文件的大小&#xff0c;使文件更易于存储和传输。gzip主要用于压缩文本文件、Tar归档文件和网页。不建议使用gzip来压缩图像、音频、PDF文档和其…

【P1506 拯救oibh总部】

拯救oibh总部 题目背景 oibh 总部突然被水淹没了&#xff01;现在需要你的救援…… 题目描述 oibh 被突来的洪水淹没了&#xff0c;还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示&#xff0c;而一个四面被围墙围住的区域洪水是进不去的。 oibh 总部内部也有许…

【后端高频面试题--SpringBoot篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 这里写目录标题 1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f;2.列举一些Spri…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

JS逆向手记01__前端基础

系列文章目录 系列手记占位 文章目录 系列文章目录前言一、js自执行函数语法二、js变量类型的转换&#xff08;与字符串相加&#xff09;三、浏览器环境&#xff08;BOM&#xff09;四、html渲染环境&#xff08;DOM&#xff09;五、html发起请求&#xff08;表单form&#xf…

书生·浦语大模型第四课作业

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 1.安装 # 如果你是在 Int…

Java是如何实现的平台无关?

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 1、什么是平台无关性 平台无关性就是一种语言在…

寒假作业

手写盗版微信登入界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(421,575);this->setFixedSize(421,575);th…

C#系列-C#EF框架实现雪花主键(20)

在C#中&#xff0c;使用Entity Framework (EF) 框架并不直接涉及到主键的生成策略。主键的生成通常是在数据库层面或者在应用程序层面处理的。雪花主键&#xff08;Snowflake ID&#xff09;是一种在分布式系统中生成唯一ID的算法&#xff0c;它通常是由Twitter的雪花算法演变而…

接口测试框架分析

框架大体上已经写完了&#xff0c;不过说实话好多代码让我自己写我也写不出来&#xff0c;那该怎么办呢&#xff1f;很简单&#xff0c;把现在已经写好的代码保存起来&#xff0c;等用的时候拿出来复制粘贴就好了&#xff0c;如果你是大神&#xff0c;自己会写&#xff0c;那就…

TikTok:短视频时代的崛起

导言&#xff1a; TikTok&#xff0c;作为一款全球短视频社交应用&#xff0c;正风靡全球&#xff0c;引领着数字娱乐的新潮流。其简洁的用户界面、创意无限的短视频内容&#xff0c;以及强大的社交互动功能&#xff0c;使其成为全球数以亿计的用户喜爱的平台。 TikTok的特点&a…

H5 红色文字抖动网址发布页/引导页源码

H5 红色文字抖动网址发布页/引导页源码 源码介绍&#xff1a;一款红色文字抖动网页源码&#xff0c;可用于引导页或网址发布页。 下载地址&#xff1a; https://www.changyouzuhao.cn/10470.html

第9讲用户信息修改实现

用户信息修改实现 后端修改用户昵称&#xff1a; /*** 更新用户昵称* param wxUserInfo* param token* return*/ RequestMapping("/updateNickName") public R updateNickName(RequestBody WxUserInfo wxUserInfo,RequestHeader String token){if(StringUtil.isNot…

在JavaScript或TypeScript中,@符号的用法

在JavaScript或TypeScript中&#xff0c;符号在导入语句中用作包名的一部分&#xff0c;表示该包是一个命名空间包&#xff08;Namespace package&#xff09;或作用域包&#xff08;Scoped package&#xff09;。这种命名方式主要用于组织和管理由同一组织或个人发布的相关包。…