文件操作
C++ 通过以下几个类支持文件的输入输出:
ofstream: 写操作(输出)的文件类 (由ostream引申而来)
ifstream: 读操作(输入)的文件类(由istream引申而来)
fstream: 可同时读写操作的文件类 (由iostream引申而来)
more >>
努力不一定成功,不努力一定不成功!
cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。
cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。
使用cin从标准输入读取数据时,通常用到的方法有cin>>,cin.get,cin.getline
cin>><变量1>[>><变量2>>>…>><变量n>];
其中“>>”称为提取运算符,用于读取用户输入的数据,赋给变量。在cin之后“>><变量>”可重复多次。输入多个数据时数据之间要用空格、TAB、或者ENTER键隔开,系统会自动跳过空格和回车符,将输入的数据赋给各提取运算符的变量。回车符有两个作用一个是分隔符另一个是刷新缓冲区,并通知cin已经输入一行数据。
more >>
atoi函数是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束符(‘\0’)才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。1
2
3
4
5
6
7
8
9
10#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int n;
char *str = "12345";
n = atoi(str);
printf("n=%d\n",n);
return 0;
}
输出n=123456
more >>
昨天聊了常量指针和指针常量的区别,今天继续一个比较容易混淆的话题,指针数组和数组指针=.=!
含义:指向数组的的指针
(1)数组在内存中的表示
创建一个数组就是在内存里面开辟一块连续的空间,比如int a[4];就是在内存里面开辟了一个大小为4*sizeof(int)字节的内存空间。而二维数组是特殊的一维数组。1
2
3
4
5
6
7#include<stdio.h>
void main()
{
int a[2][2]={1,2,3,4};//这是一个2*2的二维数组
int (*p)[2];//数组指针
p=a;//令p指向数组a
}
这里p是一个指向数组的指针。
more >>
是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
官方解释:设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
尼玛,这都是啥,想必没有见过这个算法的小可爱,对这个官方解释可能是一脸懵逼。所以我就把这个算法通俗的讲一讲。
首先要对一堆数字排序我们必须找到一个基准数。而这个基准数可以是这一堆数字中的任意一个,我们定义两个移动的变量从数组的两头向中间检索。从右往左走的变量找到一个小于基准数后停止,从左往右的的变量找到一个大余基准数后停止然后这两个数就交换一下,直到两个变量相遇后就遍历了整个数组,这时候数字的左边都小于基准数,右边大于基准数。然后把数组分成两部分在执行遍历交换后,就完成排序了。
more >>
在面试中我们经常会被面试官问到什么是常量指针,什么又是指针常量。可能第一次被问到都会有些懵逼(大神略过)。我今天就来讲一讲这二者的区别。
下面开始正题。。。。
指针常量:顾名思义它就是一个常量,但是是指针修饰的。
格式为:
1 | int * const p //指针常量 |
在这个例子下定义以下代码:
1 | int a,b; |
因为声明了指针常量,说明指针变量不允许修改。如同次指针指向一个地址该地址不能被修改,但是该地址里的内容可以被修改
more >>
1 | char *strcpy(char *strDes, const char *strSrc) |
1 |
|
1 |
|
注意:1.不能向形参传递指向字符串常量的指针(本题中dst和src都是指向串常量的指针,字符串常量存储在常量区不能被修改 2.传递的字符数组前一个实参的所分配的内存空间必须足够大
1 |
|
1 |
|
1 |
|
断言:assert(表达式)如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句,使用这个宏前需要包含头文件assert.h
结语:函数就向一个黑盒一样,调用它的人给他输入(调用它本身就是一种输入),然后等待一个理想中的输出或者是相应的操作。调用者是希望我们的这个函数能够非常健壮的让他们利用,那么为了使我们的函数拥有一定的鲁棒性。
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true