C++初学(7)

news2024/9/8 23:33:38

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.coloradmin.cn/o/1957877.html

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

相关文章

Mecanim Animation System

动画系统简介 Unity 有一个非常丰富而又复杂的动画系统&#xff0c;官方称其为Mecanim。该系统具有以下功能&#xff1a; 支持从外部导入动画剪辑&#xff0c;如&#xff1a;fbx、mb | ma&#xff08;Autodesk maya 原件&#xff09;、.max&#xff08;3ds Max原件&#xff09…

5.仓颉编程_数组使用与异常捕捉

5.仓颉编程_数组使用与异常捕捉 数字数组与字符串数组 import std.console.*main() {var qty 10var zero2 0var array [1,2,3] //数组var str_arr:Array<String> [aa,bb]try {//qty qty / zero2//println(qty)println(str_arr[0])println(array[0])// println(arr…

rhce THE homework of first

ssh远程免密登录成功 下载httpd和nginx 关闭防火墙 查看selinux的状态 为服务器配置ip 填充网站的内容 添加服务器配置 将文本写入网站

2024电赛H题参考方案(+视频演示)——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、移植MPU6050模块 3、移植TB6612电机驱动模块 4、整体控制方案视频演示 总结 一、题目要求 小编自认为&#xff1a;此次H题属于控制类题目&#xff0c;相较于往年较为简单&#xff0c;功能也算单一&a…

深入解析 GZIP 压缩传输:优化网络性能的利器

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

MATLAB中“varargin”的作用

varargin是什么&#xff1f; 在MATLAB中&#xff0c;varargin是一个特殊的变量&#xff0c;用于接收函数输入参数中的可变数量的参数。它允许用户在调用函数时传递不确定数量的参数。 varargin的本质是一个包含了所有可变参数的cell数组。在函数内部&#xff0c;可以使用cell…

dpdk 响应icmp请求(Echo or Echo Reply Message)

注&#xff1a;对于"Echo or Echo Reply Message"类型的icmp报文&#xff0c;响应报文的Identiy和Sequence Number的值与请求报文的这两个字段的值要相同。 Identifier&#xff08;标识符&#xff09;字段通常由发送方设置&#xff0c;并被用于将ICMP请求与相应的回复…

Lombok注解之@SneakyThrows作用

Lombok注解之SneakyThrows作用 读法 [ˈsniːki] [θroʊz] 悄悄的 抛出顾名思义&#xff0c;它能够自动偷摸的为咱们的代码生成一个try…catch块&#xff0c;并把异常向上抛出来。 使用 SneakyThrows的使用范围&#xff1a; 只能作用在方法和构造函数之上。从源码就可以…

【C++】选择结构-多条件if语句

多条件if语句格式为 if(第一个条件) else if(若第一个条件未满足&#xff0c;执行此条件) {第二个条件满足执行此操作} else if(若第二个条件未满足&#xff0c;执行此条件) {第三个条件满足执行此操作} ...... else{若所有条件都不满足执行此操作} 下面是一个实例 #inc…

app逆向实战:某咨询6.0.4.4版本signature等参数抓包与破解

本篇博客旨在记录学习过程&#xff0c;不可用于商用等其它途径 入口 密码登录接口 抓包 根据抓包结果得知动态参数是client_timestamp&#xff0c;keyword&#xff0c;client_session&#xff0c;sig&#xff0c;sigTime&#xff0c;cursor 初步观察得出以下结论&#xff…

负债了,打死也别干的六件事!逾期了,六句谎言千万别信!

负债这事儿&#xff0c;真是一言难尽&#xff0c;稍不留神&#xff0c;就可能让情况雪上加霜。今儿咱们聊聊&#xff0c;负债后那几件打死也别干的几件事&#xff0c;尤其是针对还没有逾期的朋友们&#xff0c;免得后悔莫及。 首先&#xff0c;千万别动歪脑筋&#xff0c;拿公款…

深入剖析:GaussDB与MySQL在COUNT查询中的并行化技术

引言 数据库查询性能优化是数据库管理和开发中的一个重要议题。在处理大数据量的COUNT查询时&#xff0c;传统的单线程处理方式可能无法满足现代应用的性能需求。GaussDB(for MySQL)和MySQL作为流行的数据库系统&#xff0c;它们在并行查询优化方面有着各自的策略和技术。本文…

【C++】C++的类型的转换

目录 C语言中的类型转换 C中的类型转换 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast C语言中的类型转换 C语言中又两种类型转换&#xff1a;&#xff08;强制&#xff09;显示类型转换和隐式类型转换。 &#xff08;强制&#xff09;显示类型…

多线程与并发思想

问题分析 设计并发程序的目的就是为了使程序运行得更快&#xff08;时间就是金钱、生命&#xff09;&#xff0c;提高软件的性能。并发程序之所以能快&#xff0c;就在于这个“并”字&#xff0c;因为程序能并发(单核)或并行(多核、多CPU)执行&#xff0c;当然能快。这就好比工…

修改linux服务器上的mariadb/mysql数据库的密码

文章目录 一、查看数据库的状态二、修改密码 可能我们在最初安装数据库时没有设置密码或者已经设置了但是又想修改另一个密码&#xff0c;可以这样操作来修改我们的密码。 以数据库 mariadb 为例。 一、查看数据库的状态 使用命令 systemctl is-active mariadb 查看当前数据库…

链表篇-02.从尾到头打印链表(反转链表)

解题思路&#xff1a; 链表从尾到头打印链表, 我的思路是 用三个指针,第一个指针(pre)指向指向头节点的前一个位置&#xff0c;第二个指针(cur)指向头节点&#xff0c; 然后依次往后执行&#xff0c;第三个指针用于临时记录第二个指针的下一个位置。 代码详情: import java.…

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

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

python学习笔记——字符串

一、创建字符串 1.我们可以使用引号( 或 " )来创建字符串。创建字符串很简单&#xff0c;只要为变量分配一个值即可。 var1 Hello World! var2 "Runoob" 二、访问字符串中的值 1.Python 访问子字符串&#xff0c;可以使用方括号 [] 来截取字符串。…

RocketMQ的Admin Tool工具

文档&#xff1a;https://github.com/apache/rocketmq/blob/develop/docs/cn/operation.md写的很全面&#xff0c;我写了一半就偷懒了&#xff0c;地址放这里。 命令大全&#xff1a;https://github.com/apache/rocketmq/blob/develop/docs/cn/operation.md 1. 删除讨厌的告警…

VUE3——003、VUE 项目中的文件结构(index.html、main.ts、App.vue)

虽然是号称是小白初学&#xff0c;但本文只是对 VUE 小白&#xff0c;其它的基功还是有一丢丢的&#xff0c;不太懂的同学去看看一下详解&#xff0c;我这里记述的是自己的理解和观点。见谅&#xff01; index.html&#xff1a;入口文件&#xff08;以创建 vue3 项目的默认文件…