【C++】近期知识点杂记(getline、cin、nullptr与C语言风格的字符串、stoi函数、new)

前言

最近在做题的时候,遇到了一些之前不会的知识点,所以写一篇文章总结一下

getline函数

这个函数用于读取数据 并将数据存入字符数组中
常用于解决输入带有空格的语句

gets()的作用和它类似,但gets()在标准中已经被废弃 虽然现在仍可以使用 但还是建议使用getline()

getline()和gets()的区别

getline()函数直到遇到指定的停止符或读取到指定的字符数量才会停止读取(说明可以设定读入的字符数量)
而gets()函数直到遇到换行符或读取到文件结束符才会停止读取

并且 getline()函数在读取字符时会检查缓冲区溢出 ,它通过将读取的字符存储在由用户提供的缓冲区中,并在读取完毕后添加空字符来保证安全性。

cin

cin用于输入数据,我最近发现了它的一个特性,(大概可以算作是特性吧)

下面先来看看一段代码

#include

int main()
{
	int a;
	char ch;
	if (!(std::cin >> a))
	//注释1
	{
		std::cin.clear();
		//注释2
		std::cin >> ch >> a;
		//注释3
	}
	return 0;
}

注释1

这个可以算是cin的一个特点吧

当输入类型和变量的类型不同时,比如a是int类型,我传进去一个字符 这么写其实是有问题的 程序不会继续读入 它会将输入的数据保存在缓冲区

注释2

clear函数
有两个用途:
清空容器中的所有元素,比如vector

另一个用途,清除输入流中的错误标志

上面在注释1中,因为类型不匹配,就产生了错误信息
使用clear函数清除错误信息 就可以继续输入

补充

在这里补充一下另一个函数:sync
sync函数可以将缓冲区的数据直接存入磁盘

感兴趣的可以了解一下 不做过多介绍

在操作系统中,除非设置了自动同步,否则在写入文件时,数据并不会即时写入到磁盘中,而是先写入内存中的系统缓冲区。当系统缓冲区的数据积累到一定数量后,会有系统进程一次性将缓冲区中的数据写入磁盘。这样,如果在数据写入磁盘之前发生意外断电,那么系统缓冲区内的数据将会丢失。

因此,在一些需要确保数据不会丢失或损坏的重要场合,如在写入一些重要数据后,通常会在写入结束后调用sync函数,以确保数据被写入磁盘。

需要注意的是,sync函数返回0表示同步成功,如果返回-1则表示同步失败。同时,即使sync函数已经返回,并不代表写入磁盘的过程已经结束,仍然可能会出现故障。对于可靠性要求比较高的应用,通常会使用更加可靠的同步IO方式,如fsync和fdatasync。

注释3

这其实是利用cin,然后直接从缓冲区读取(scanf也可以)
这个知识点我之前一直都不知道 所以记录一下

了解了这个知识点 做下面这道题就很轻松了
P1957 口算练习题

nullptr与C语言风格的字符串

当我写出如下代码的时候,编译器报错了

	char array[20] = { nullptr };

报错信息:
在这里插入图片描述

我心想,nullptr不就是空指针吗,凭什么不能用于初始化C语言风格的字符串

后来,经过学习我才知道,NULL和nullptr是有很大区别的

C风格字符串是字符指针,其末尾是一个空字符(‘\0’)。
nullptr在C++中是一个特殊的指针值,表示指针不指向任何对象。尽管nullptr可以被用来初始化C风格字符串的指针,但是,你不能直接将nullptr赋值给一个C风格字符串。

并且 NULL和nullptr是有一定的区别的

在定义上
NULL其实是int类型 他是用宏定义

nullptr是一个指针类型,是一个真正的关键字

所以,这也许就是nullptr比NULL更安全的原因之一

stoi函数

stoi函数的作用是 将字符串转换成int类型的数据
被包含在这个函数中

下面给出一个例子

#include
#include
#include

using namespace std;

int main()
{
	string str = "12345";
	cout << typeid(str).name() << endl;

	int num = stoi(str);

	cout << num << endl; 
	cout << typeid(num).name() << endl;

	return 0;
}

补充:
对于不清楚typeid关键字的同学 可以去查一下 它的作用是获取一个变量的类型

new关键字

new关键字,用于开辟空间,声明的变量存储在

下面给出一个例子

关于创建一个int类型变量和数组的例子 以及如何释放他们所占据的内存

#include

using namespace std;

int main()
{
	int* ptr = new int;
	//动态分配一个int类型的变量
	int* ptr1 = new int(5);
	//动态分配一个int类型的变量 初始化为5
	int* ptr2 = new int[4];
	//动态分配一个数组 数组大小为4

	*ptr = 10;

	cout << *ptr << endl;

	//注意 使用new创建变量之后 当不需要这个变量时 必须用delete释放掉开辟的这块内存 不然会发生内存泄漏
	delete ptr;
	delete[] ptr2;
	//释放数组的内存时 要注意语法格式
	return 0;
}

delete关键字

delete关键字 就是用来释放new开辟的空间

释放变量的内存时 可以在后面跟上变量名

delete ptr;

释放数组的内存时 要注意在delete后面跟上[]

delete[] ptr;

结语

因为最近时间不太够 并且大部分时间都放在做题上了 对于这些细小的知识点 不做详细介绍 只是简单的介绍一下使用方法

希望对你有帮助 我们下次见~

每日一遍:
我爱编程!编程爱我! C++太牛了!
(其他的语言也很牛!)

你可能感兴趣的:(C++知识点,c++,c语言,java)