【数组、结构体、指针】C++ Prime Plus Ch4——复合类型

本文详细介绍了C++中的复合类型,包括数组的声明与初始化,特别是C++11的新特性;C风格字符串的使用,如字符串拼接、输入处理;string类的介绍及其便捷操作;结构体的概念与使用,以及结构数组;共用体的介绍与应用;枚举的创建与使用;指针与动态存储空间的管理,包括new和delete操作;以及数组的代替品vector和array模板类。
摘要由CSDN通过智能技术生成

1.数组

通过程序分析数组的使用:

#include<iostream>
int main()
{
	using namespace std;
	int yams[3] = { 7,8,6 }; //数组的声明和初始化
	int yamscost[3];         //数组的声明
	yamscost[0] = 20;
	yamscost[1] = 30;
	yamscost[2] = 5;
	cout << "Total yams = "
		<< yams[0] + yams[1] + yams[2]<<endl;
	cout << "The package with "
		<< yams[1]
		<< " yams costs "
		<< yamscost[1]
		<< " cents per yam.\n"
		<< "The total yam expense is "
		<< yamscost[0]*yams[0] + yamscost[1]*yams[1] + yamscost[2]*yams[2]
		<< " cents.\n" << endl;
	cout << "Size of yams ayyay = "
		<< sizeof(yams)
		<< " bytes.\n"
		<< "size of one element = "
		<< sizeof(yams[0])
		<< " bytes.";
	return 0;
}

1.数组的声明:

typeName arrayName[arraySize]

arraySize 必须是整型常数(例如10)或者const值,也可以是常量表达式(8*sizeof(int)),不可以是变量;数组下标从0开始;编译器编译不会检查下标溢出或错误。

2.数组的初始化:

C++允许在声明语句中初始化数组元素,同C语言,如果没有初始化则表明数组中元素的值是不确定的,初始化数量可以小于数组中元素数量,编译器会自动设置为0,均同C语言,也可以不设置数组的大小,让编译器根据初始化数组的值自己确定大小。

只有在数组声明时才可以初始化,否则就要使用下标分别给数组中元素赋值。

C++11数组初始化方法:

①省略掉等号: double earnings[4] {1,2,3,4};

②均初始化为0:  doublle earnings[4]{ };

③不允许缩窄:

long plifs[] = { 23,45,3.0 }; //编译错误,因为将3.0浮点型缩减为整型,这是不允许的
	char slifs[4]{ 'h','i',1122011,'\0' };//编译错误,1122011超过了char范围
	char tlifs[4]{ 'h','i',112,'\0' };//编译正确,因为112在char的范围中

2.字符串——C风格字符串

①介绍:

字符串被存储在char数组中,并且以空字符为结尾的字符数组才是字符串;也可以初始化时用双引号引起来来初始化字符串,这种字符串被称为字符串常量或字符串字面值,括起来的字符串隐式包括空字符,一定要确保数组足够大,一般采用编译器自动确定数组大小;字符串中的字符实际上表示的是字符串所在的地址(C++中不允许通过字符串数组来使用地址值,因为地址在C++中是一种独立的变量),与字符不同,字符存储的是ascii码值,本质还是int数据。

②在数组中使用字符串

#include<iostream>
int main()
{
	using namespace std;
    const int Size = 15;
	char name1[Size];
	char name2[] = "C++ owboy"; //字符串常量初始化
	cout << "Howdy! I'm "
		<< name2
		<< "! What's your name?" << endl;
	cin >> name1;               //字符串键盘输入初始化
	cout << "Well,"
		<< name1
		<< ",your name has "
		<< strlen(name1)
		<< " letters and is stored in an array of "
		<< sizeof(name1)
		<< " bytes.\n";
	cout << "Your initial is "
		<< name1[0]
		<< "." << endl;
	cout << "Here are the first 3 characters of my name:"
		<< name2[0]
		<< name2[1]
		<< name2[2];   //通过索引找到数组中的字符
           //也可以有另一种办法
          // name2[3]='\0';
         //cout<<name2;

	return 0;
}

2.1拼接字符串常量:

任何由两个空白(空格 制表 换行符)分隔开的字符串常量都将自动拼接成一个,在拼接时不会考虑在被连接的字符串后边添加空格,并且第一个字符串的空白符会被第二个字符串的第一个字符取代。

2.2数组中使用字符串:

将字符串存储到数组中最常用的方法:将数组初始化为字符串常量 或者通过键盘或文件输入读入到数组。

该程序使用符号常量来指定数组的长度,使用符号常量来表示数组长度,当需要修改程序以使用不同的数组长度时,会比较方便——只需要在定义符号常量的地方进行修改就好。

2.3字符串输入——一行字符串输入

对于上边的程序,cin使用空白来确定字符串的结束位置,所以当我们输入名字为abc def时,仅会显示名字为abc,如何解决这个问题呢?

①每次读取一行字符串输入:

istream中的类(cin)提供了一些面向行的类成员函数:getline()和get().

getline():

getline(存储行的数组名称,要读取的字符数)——cin.getline(name,20)

getline()函数读取一行输入,直到遇到换行符,随后getline()将丢弃换行符,会用空字符来代替换行符原来的位置。

get():

get(存储行的数组名称,要读取的字符数)——cin.get(name,20)

get()并不丢弃换行符,而是将换行符留在输入队列中,这会导致空行问题。

②空行问题

当get()或getline()读取空行时,get()读取空行后将设置失效位,这意味着接下来的输入将被阻断,使用cin.clear()恢复输入;

另一个潜在问题是:如果输入字符多于指定的字符,两个函数均会将余下的字符留在队列里,getline()会设置失效位,并关闭后边的输入。

如果连续两次使用get()函数,那么第二句的get()函数什么都得不到,因为它会读取输入队列中被第一个get函数留在队列中的换行符,这导致第二句输入会读取到一个空行,如何解决该问题呢,使用get()将空格单独读取即可。

③get()函数的合并

cin.get(name,Size)返回一个cin对象,因此还可以调用get函数。

cin.get(name1,Size1).get(name2,size2);

cin.getline(name1,size1).getline(name2,size2);

2.3字符串输入——混合输入字符串和数字

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

	return 0;
}

问题:cin读取年份时,换行符留在输入队列里,导致后边的cin.getline()读取到一个空行,所以要处理掉被留在队列里的换行符,在输入数字后加入cin.get()来读取换行符,或者(cin>>year).get()来读取换行符。

3.string类简介——利用string类来处理数组,更加简单方便

①介绍

要使用string类,必须包含string的头文件,string类隐藏了字符串的数组性质,能够像处理普通变量那样处理字符串。

#include<iostream>
#include<string>    //包含该头文件
int main()
{
	using namespace std;
	char charr1[20];
	char charr2[20] = "abcdefg";  //C风格来初始化
	string str1;
	string str2 = "hijklmn";
	cout << "Enter a kind of feline:";
	cin
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值