第四章总结(一)

创建和使用数组

创建数组就很简单了,就直接typeName arrayName[size],这里的typeName 可以是你自己定义的结构体,也可以是基本数据类型,然后这里的size如果是在VS编译器中,必须是常量或者是const变量,这里的常量是说你直接把size写死,比如int a[5]。
但是实际这种还是不太方便,因为我们有时候确实不知道数组应该开多大,这里就需要我们去动态的申请数组,也就是使用new,直接用代码讲解

#include<iostream>
using namespace std;

int main()
{
	int size;
	cin >> size;
	int i;
	//创建部分
	int* myArrat = new int[size];
	for (int i = 0;i < size;i++)
	{
		myArrat[i] = i;
	}
	//使用部分
	for (int i = 0;i < size;i++)
	{
		//这里的myArrat指向空间的首地址,myArrat+i表示跳到下一个元素的地址
		*(myArrat + i) = 10 * i;
	}
	for (int i = 0;i < size;i++)
		cout << myArrat[i] << endl;
	return 0;
}

在这里插入图片描述

初始化部分

除了常规的初始化方法,也可以使用上一篇讲过的大括号的方法
int a[5] = {0} 所有元素初始化为0
int a[5] = {10} 第一个元素为10,后面都为0
int a[5]{} 所有元素初始化为0
同样大括号不允许缩窄转换,及不允许int a[5]{1.0}

字符串

C风格字符串

C风格字符串就是以空字符’\0’结尾的char数组,下面代码可以看出,strlen等字符串操作函数都是以最后的空字符作为结束的标记

char a[3] = { 'a', 'b', 'c' };
char b[4] = { 'a', 'b', 'c', '\0' };
cout << strlen(b) << endl; //3
cout << sizeof(b) << endl; //4

但是上面这种方法未免太过麻烦, 需要一个字母一个字母的写,所以有了下面这种写法
char a[] = “hello world”;
这种写法char数组a的长度会被编译器自动初始化,然后"hello world"被称为字符串常量

输入

关于cin>>,cin.getline(str, size),cin.get(str,size),cin.get(),以及getline(istream,string)混合使用及可能出现的问题,参考下面博客
https://blog.csdn.net/leowinbow/article/details/82190631

我自己的话总结一下就是,cin>>在你输入的时候,你按回车,会把你敲得东西放进缓冲区,然后回车产生的换行符也被送了进去,然后检测到缓冲区有换行,cin>>便把缓冲区的数据放进变量里,然后换行符还在缓冲区,这样紧接着使用cin.getline(str, size),cin.get(str,size),以及getline(inStream,str)时就会把换行符读走,导致和我们想的不一样,那为什么连续两次使用cin却不会异常呢,因为cin的时候,并不是只要读取到回车符就执行完cin,而是必须要读取到相对应的类型的内容从键盘敲入,才会真正执行完cin,不允许输入为空,所以cin>>在等待键盘敲入时,你哪怕先敲回车符,cin>>语句也不会执行结束

string类简介

头文件 #include,然后string str,str的类型是一个string,但是str[0]的类型是一个char,然后string的对象可以自动改变大小,初始化的话既可以使用大括号,也可以直接指定字符串常量上去

赋值,拼接和附加

之前我们使用char数组的时候,如果需要进行赋值,可能会出现问题,但是string的话就不会了,比如下面这段代码

string str1 = "hello";
	string str2 = str1;
	char ch1[6] = "hello";
	char ch2[10];
	strncpy_s(ch2, ch1, 2);//这里表示从ch1中拷贝两个字符到ch2中,但是ch2是否有空间存储,这个无法判断,如果是char ch2[1]的话,还是会有运行时错误
	cout << str2 <<"---"<<ch2;

但是string就不会出现这种问题,因为可以自己调整容量,这一点可以通过string类的capacity方法查看,这个方法返回的就是系统为string对象开辟的容量,当容量满的时候,会自动添加,而且扩容也是有规律的,至于为什么是16,应该是和不同的编译器有关
(环境为vs2019)

string str1 = "hello";
	cout << str1.size() << endl; //5
	cout << str1.capacity() << endl; // 15
	str1 = "hello hello hello";
	cout << str1.size() << endl;//17
	cout << str1.capacity() << endl;//31
	str1 = "hello hello hello messi messi messi";
	cout << str1.size() << endl;//35
	cout << str1.capacity() << endl;//47

拼接的话,char数组使用strncat,string直接用+号就行了,然后这里只是做一个简介,因为后面第十六章的时候还会详细介绍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章