• 【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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    注释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 };
    
    • 1

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

    我心想,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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    补充:
    对于不清楚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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    delete关键字

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

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

    delete ptr;
    
    • 1

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

    delete[] ptr;
    
    • 1

    结语

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

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

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

  • 相关阅读:
    11-zinx-Golang-MMO服务器-AOI算法实现
    PTA题目 两个数的简单计算器
    【干货】交换机的接口类型完全实物了解
    让GitHub炸锅的深入理解MySQL实战手册,竟出自阿里云“藏经阁”
    算法训练 第六周
    详解升讯威在线客服系统前端 JavaScript 脚本加密技术(1)
    PySpark - python package的测试
    CentOS发生ping百度失败以及连接不到网关的问题解决
    基础选择器、层级选择器、基本过滤选择器、内容过滤选择器
    数据结构之静态链表
  • 原文地址:https://blog.csdn.net/cat_with_cat/article/details/133221362