C++初学(7)

7.1、字符串

字符串是存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种,第一种是来自C语言,常被称为C风格字符串,另一种则是基于string类库的方法。

存储在连续字节中的一系列字符意味着可以将字符存储在char数组中,其中每个字符都位于自己的数组元素只能中。C风格字符串以空字符结尾,空字符被写作\0,其ASCLL码为0,用来标记字符串的结尾。

char dog[8]={'b','e','a','u','x',' ',''I','I'};
char cat[8]={'f','a','t','e','s','s','a','\0'};

如上面两行代码,只有第二个是字符串。cout等函数都逐个处理字符串中的字符,直到空字符为止。如果用cout显示cat数组时,则将显示前7个字符;如果用cout显示dog数组时,则将显示数组内的8个字母,并接着将内存中随后的各个字符解释为要打印的字符,直到遇到空字符位置。

将数组初始化字符串不必像上面那么复杂,可以只需使用一个用引号括起来的字符串即可,这种字符串被称为字符串常量或字符串字面量。如下所示:

char bird[11]="Mr.Chess";
char chicken[]="CXKuns";

用引号括起来的字符串包括结尾的空字符,因此不用写。如果通过键盘进行输入字符串时,将会自动加上结尾的空字符,因此要确保数组足够大能够存放空字符。

注:字符串常量(使用双引号)不能与字符常量(使用单引号)互换。如'S'只是83的另一种写法,而"S"表示的是两个字符(字符S和\0)。

7.1.1、拼接字符串常量

有时候字符串很长不能放到一行,C++允许进行拼接。如下面语句都是等效的:

cout<<"I'd give my right arm to be " "a great violinist.\n";
cout<<"I'd give my right arm to br a great violinist.\n";
cout<<"I'd give my right ar"
"m to be a great violinist.\n";

7.1.2、在数组中使用字符串

下面给一个程序,将一个数组初始化为用引号括起的字符串,并使用cin将一个输入字符串放到另一个数组中。还使用了C语言库函数strlen()来确定字符串的长度。头文件是cstring(老式为string.h)。

#include <iostream>
#include <cstring>
int main()
{using namespace std;const int Size = 15;char name1[Size];char name2[Size] = "C++程序员";cout << "Hello!I'm " << name2;cout << "!What's your name?" << endl;cin >> name1;cout << "Well, " << name1 << ",your name has ";cout << strlen(name1) << " letters and is stored" << endl;cout << "in an array of " << sizeof(name1) << " bytes." << endl;cout << "Your initial is " << name1[0] << ".\n";name2[3] = '\0';cout << "Here are first 3 characters of my name: ";cout << name2 << endl;return 0;
}

程序说明:

(1)sizeof运算符指出整个数组的长度:15字节;

(2)strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度,另外strlen()只计算可见的字符,不计算空字符,因此对于Furina返回的值是6。

(3)由于name1和name2是数组,所以可以用索引来访问数组中各个字符。另外程序将name2[3]设置为空字符,这使得字符串在第3个字符后即结束。

7.1.3、字符串输入

下面给一个程序

#include <iostream>
int main()
{using namespace std;const int ArSize = 20;char name[ArSize];char dessert[ArSize];cout << "Enter your name:" << endl;cin >> name;cout << "Enter your favorite dessert:" << endl;cin >> dessert;cout << "I have some delicious " << dessert;cout << " for you," << name << ".\n";return 0;
}

哎?这个程序是不是有问题,怎么还没输入dessert就进行了下去?

由于不能通过键盘输入空租房有,因此cin需要用别的方法来确定字符串的结尾位置。cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。

这个程序中,cin把Alistair作为第一个字符串,并将他放到name数组中。把Dreeb留在输入队列中,当cin在输入队列搜索时,将Dreeb放进dessert数组中。

7.1.4、每次读取一行字符串输入

每次读取一个单词有时候很烦,如果要输入城市时将很难搞,这时候需要采用另一种字符串读取方式,采用面向行读取而不是单词读取。istream中的类提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到到达换行符。getline()将丢弃换行符,而get()将换行符保留在输入序列中。

7.1.4.1、getline()

getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。

例如,假设要试用getline()将姓名读入到一个包含20个元素的name数组中。可以这么调用:

cin.getline(name.20);

注:如果参数为20,那么函数只能最多读取19个字符,剩余空间用于存储自动在结尾处添加的空字符。

如果将上面程序修改为使用cin.getline(),将可以正常输入。

7.1.4.2、get()

istream类有一个名为get()的成员函数,该函数有几种变体,其中一种变体的工作方式与getline()类似,它们接受的参数相同,解释参数的方式相同,并且都读取到行尾。但get并不是停止读取且丢弃换行符,而是将换行符继续留在队列中。假设我们调用两次get(),程序只会运行第一次get(),因为第一次get()留下了换行符,第二次get()一开始读取到换行符,也就停止读取。

当然面对上面的情况下,get()有一种变体。使用不带参数的cin.get()调用可读取下一个字符(是的,换行符也可以),只要在调用两个get()之间加上cin.get()就行了。或者合并起来,如:

cin.get(name,ArSize).get();

下面进行改进:

#include <iostream>
int main()
{using namespace std;const int ArSize = 20;char name[ArSize];char dessert[ArSize];cout << "Enter your name:" << endl;cin.get(name, ArSize).get();cout << "Enter your favorite dessert:" << endl;cin.get(dessert, ArSize).get();cout << "I have some delicious " << dessert;cout << " for you," << name << ".\n";return 0;
}

好了这样就能顺利实现了。

7.1.5、混合输入字符串和数字

混合输入数字和面向行的字符串会出现问题,看一下下面程序:

#include <iostream>
int main()
{using namespace std;cout << "What year your house bulit?" << endl;int year;cin >> year;cout << "What is its street address?" << endl;char address[80];cin.getline(address, 80);cout << "Year bulit: " << year << endl;cout << "Bulit: " << address << endl;cout << "Done!" << endl;return 0;
}

只输入了年份了就结束了运行,问题和上面一样,cin读取年份时,将回车键生成的换行符留在了输入队列里,因此将cin>>year改成(cin>>year).get()就行了。

#include <iostream>
int main()
{using namespace std;cout << "What year your house bulit?" << endl;int year;(cin >> year).get();cout << "What is its street address?" << endl;char address[80];cin.getline(address, 80);cout << "Year bulit: " << year << endl;cout << "Bulit: " << address << endl;cout << "Done!" << endl;return 0;
}

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

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

相关文章

微信小程序开发 快速学习 这篇就够了

目录 一、配置篇 &#xff08;1&#xff09;官网链接&#xff1a; &#xff08;2&#xff09;项目分析 &#xff08;3&#xff09;调试器 &#xff08;4&#xff09;预览体验 &#xff08;5&#xff09;配置文件 &#xff08;6&#xff09;配置pages &#xff08;7&…

CSRF Token 原理

CSRF 攻击 CSRF 攻击成功的关键是&#xff0c;恶意网站让浏览器自动发起一个请求&#xff0c;这个请求会自动携带 cookie &#xff0c;正常网站拿到 cookie 后会认为这是正常用户&#xff0c;就允许请求。 防范 如果在请求中加一个字段&#xff08;CSRF Token&#xff09;&am…

鸿蒙开发—黑马云音乐之Music页面

目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果&#xff1a; 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…

kubernetes管理GUI工具Lens

从github上可以知道&#xff0c;lens的前端是用electron做的客户端工具&#xff0c;打开安装路径你会发现kubectl.exe,没错&#xff0c;就是你经常用的kubectl命令行的客户端工具。kubectl本来就能输出json的数据类型&#xff0c;集成前端更方便了。看到这里你是不是发现&#…

Linux云计算 |【第二阶段】AUTOMATION-DAY5

主要内容&#xff1a; YAML语法格式&#xff0c;层级关系、Ansible Playbook文件及语法格式、Ansible变量&#xff08;定义变量方法、优先级顺序、setup和debug查看变量&#xff09; 补充&#xff1a;Ansible ad-hoc 可以通过命令行形式远程管理其他主机&#xff0c;适合执行一…

视频逐帧播放查看神器-android闪黑闪白等分析辅助工具

背景 刚好有学员朋友在群里问道有没有什么播放软件可以实现对视频的逐帧即一帧一帧播放。在做android系统开发时候经常会偶尔遇到有时候是闪黑&#xff0c;闪白等一瞬间现象的问题。这类问题要分析的话就不得不需要对设备录屏&#xff0c;然后对录屏进行逐帧播放查看现象&…

2020真题-架构师案例(五)

问题1&#xff08;13分&#xff09; 针对该系统的功能&#xff0c;孪工建议采用管道-过滤器&#xff08;pipe and filter&#xff09;的架构风格&#xff0c;而王工则建议采用仓库&#xff08;reposilory&#xff09;架构风格。满指出该系统更适合采用哪种架构风格&#xff0c…

【C++题解】1581. 马里奥的银币1

问题&#xff1a;1581. 马里奥的银币1 类型&#xff1a;数组找数 题目描述&#xff1a; 马里奥有很多银币&#xff0c;有一天他得到了一张魔法卡&#xff0c;只要使用这张魔法卡&#xff0c;就可以使得他的银币里面的最大的银币金额变得更大。如果他最大的银币是偶数的金额&a…

获取正版免费的xshell

1&#xff0c;安装 xshell官网 打开xshell官网站点&#xff1a;NetSarang Homepage CN - NetSarang Website 请认准&#xff0c;百度的xshell中文网都是要收费的 1&#xff0c;点击 xshell的下载 点击进入xshell的下载页面&#xff0c;或者直接访问所有下载 - NetSarang Webs…

实验2-4-2 求N分之一序列前N项和**注意小细节

//实验2-4-2 求N分之一序列前N项和//计算序列 1 1/2 1/3 ... 的前N项之和。#include<stdio.h> #include<math.h> int main(){int N;double sum0.0;scanf("%d",&N);for(int a1;a<N;a)sum(1.0/a);//这里必须是1.0 不可以是1&#xff01;&#x…

VirtualBox创建共享磁盘

VirtualBox创建共享磁盘 目录 VirtualBox创建共享磁盘1、划分共享磁盘1.1、【管理】->【工具】->【虚拟介质管理】1.2、【创建】->【VDI&#xff08;VirtualBox 磁盘映像&#xff09;】->【下一步】1.3、【预先分配全部空间】->【下一步】1.4、【分配大小】->…

网络协议二 : 使用Cisco Packet Traceer工具模拟网络环境,集线器,网桥,交换机,路由器,IP,同一网段

1. 安装 Cisco Packet Tracer baidu 网盘地址&#xff0c;感谢大神分享 安装&#xff0c;破解&#xff0c;中文化&#xff0c;都有说明&#xff0c;建议使用7.x的那个版本&#xff0c;感觉比8.x的翻译要完整一点 https://pan.baidu.com/s/18iWBOfhJJRhqgQqdNQcfMQ?pwddcch#…

什么是技术作家风格指南?

技术写作风格指南旨在提供必要的格式风格&#xff0c;以帮助技术作家为读者创建引人入胜且一致的内容。然而&#xff0c;技术写作与普通的自由写作有很大不同。目的是将复杂的技术主题分解为易于理解的内容&#xff0c;以帮助读者了解如何使用产品或服务。 在本文中&#xff0…

FreeModbus学习——eMBInit初始化

FreeModbus版本&#xff1a;1.6 在mb.c文件中 先看一下静态变量的定义 /* ----------------------- Static variables ---------------------------------*/static UCHAR ucMBAddress; static eMBMode eMBCurrentMode;ucMBAddress是从机地址&#xff0c;eMBCurrentMode是M…

C++ 八股(2)

1.函数调用的参数是以什么顺序压栈的&#xff0c;为什么&#xff1f; 从右向左压栈的。因为C, C支持可变参函数。 可变参函数就是参数个数可变的函数&#xff0c;如printf()就是可变参函数 void func(int a,...){} 2.有一个函数 在main函数中通过&#xff1a;string s fun…

焦化超低排放解决方案

在环保政策日益严苛与可持续发展理念深入人心的当下&#xff0c;朗观视觉小编认为焦化行业作为传统重工业的重要组成部分&#xff0c;正经历着一场前所未有的绿色变革。其中&#xff0c;“焦化超低排放”不仅是对环境保护的积极响应&#xff0c;更是行业转型升级、实现高质量发…

【开发问题记录】启动某个微服务时无法连接到seata(seata启动或配置异常)

问题记录 一、问题描述1.1 问题复现1.1.1 将Linux中的部分微服务启动1.1.2 在本地启动当时出错的服务 1.2 解决思路1.2.1 Nacos中seata相关的信息1.2.2 Linux中seata相关的信息 二、问题解决2.1 seata的配置错误2.1.1 Nacos中seata的配置问题2.1.2 命名空间问题的发现 2.2 网络…

wpf基础

在 WPF (Windows Presentation Foundation) 中&#xff0c;Style 是一种强大的资源&#xff0c;允许你定义一组属性值&#xff0c;这些值可以被多个控件实例共享。使用 Style 可以减少重复的 XAML 代码&#xff0c;并且使得 UI 的一致性和可维护性得到提高。 以下是一些 Style…

IP地址专用SSL/https证书——10分钟签发

一般常用的SSL证书多为域名型SSL证书&#xff0c;即需要提供准确的域名。如果不能提供域名&#xff0c;只能提供IP地址&#xff0c;则需要一种特殊的SSL证书——IP地址证书。下面是IP地址证书的申请教程 IP地址专用SSL证书获取链接https://www.joyssl.com/certificate/select/…

vscode+git解决远程分支合并冲突

1&#xff09;远程分支和远程分支不复杂情况合并 例如readme的冲突 可直接在github上解决 删到只剩下 #supergenius002 合并冲突测试1/合并测试冲突1合并测试冲突2/合并测试冲突2就行 《《《/》》》也要删掉 2&#xff09;但如果是复杂的冲突&#xff0c;让我们回到vscod…