清屏
#include < windows.h >
system("cls");
输入流cin.fail()
cin.fail()来判断当前的输入的类型和预期的是否相同,如不同cin.fail()返回true;当输入流读取失败时,会将字符放在原处,等待下次读取!
此外,fail()返回了true之后要用clear()来清楚fail状态
int menuChoise(void) {
//输入功能编号
int n = 0;//用户输入的编号
while (1) {
cin >> n;
if (cin.fail()) {
cin.clear();
cin.sync();
cout << "无效输入,请重新输入" << endl;
system("pause");
}
else {
break;
}
}
return n;
}
cin.sync()清除缓存区的数据流
cin.ignore() 也是删除缓存区中的数据,但是参数控制更加精确
sizeof(string)在每个库里输出都是固定的(VS是28),sizeof(string[])输出总分配空间,字符串所占的空间是从堆中动态分配的,与sizeof()无关;str[i].length()输出实际长度。
VS调试时,继续:跳过中间至下一个断电,逐语句:会进入函数一步步执行,逐过程:执行下一行,跳出:跳出函数,黄色箭头表示当前语句还没执行,执行到前一句
string是C++的字符串、char*是C语言的字符串,把C++字符串改为C语言字符串:
mystr.c_str()
代码中的编码默认GBK,网页显示编码UTF-8,需要进行转换否乱码
使用strcmp时,确保字符数组和字符串比较的时候,字符数组后加了‘\0’这个结束字符,否则会被判断为不相等,并且\0也占一位size(sizeof的时候会占一位,strlen的时候不占)
char input[128];
scanf_s("%s", &input, 128);
int len = strlen(input);//len不算结束字符
include相当于把头文件的声明复制黏贴过去,头文件的实现中前面要包含include对应的头文件,头文件中需要保证这个头文件只被包含一次:
#pragma once //(仅vs编译器可用)
//通用写法:
#ifndef _TOOLS_H //一般为头文件大写
#definde _TOOLS_H
//...
#endif
C++默认参数只能写在后面,C语言没有默认参数、函数重载,当执行一个函数的时候会给分配一个栈空间,一般不超过2M,可以通过编译器修改,内联函数不会分配栈空间,会占用main函数的空间,适合代码简单并重复使用的函数
C++文件操作时,file.open(需要传递的是C语言的字符串即char*)
二维数组作为函数参数时,带数组长度和不带的区别在于,带数组长度的可以在函数内部使用sizeof()函数获取数组长度,而不带数组长度的则无法获取数组长度。因此,如果需要在函数内部获取数组长度,建议使用带数组长度的方式。
C++时戳
#include<time.h>
time(&start);//将当前时间戳保存到start中
将地址作为函数参数传递直接修改比直接赋值传参快得多
打印变量地址
#include<stdio.h>
printf("地址为:0x%p",&A);//会补全4个字节
printf("地址为:0x%x",&A);//不会补全,且小写字母
printf("地址为:0x%X",&A);//不会补全,且大写字母
一般指针初始化赋值为0,地址为0是无法访问的
//1、初始化为空指针
int *p = NULL;//正常合法的地址不会指向0
//2、当不知道是否有合法指向时
if(p == NULL){
//不合法
}
//3、指针不再使用时,定义为空指针
指针数组表示地址,地址加1表示下一个元素的地址
int ages[];
printf("第一个元素为%d",*ages);
printf("第二个元素为%d",*(ages+1));
同一数组指针的减法有意义,不同数组指针的减法没有意义,不同类型的指针减法也没有意义,指针的加法没有意义
const 常量用法
int const * A = &B;
*A = 26;//错误,无法通过指针修改值
A = &C;//正确
int * const A = &B;
*A = 26;//正确
A = &C;//错误,不能给常量赋值,不允许指向别的地址
const int * const A = &B;//不允许指向别的地址,不能修改指向变量的值
//总结:看const离谁近就修饰谁,类型(int)/还是离指针变量名近
二级指针、多级指针,指向指针的指针需要使用二级地址,多级指针以此类推,当指针数组作为参数传递时,接收的参数应该是二级地址即:*A[LEN],或者**A
数组作为参数的两种方式
void function(int A[12]){//传递的是数组
}
void function(int *A, int len){//传递的是地址
//可以直接访问,A[index]
}
void function(int A[], int len){//传递的是地址
//可以直接访问,A[index]
}
定义一个指向三个成员的数组的指针
int A[4][3];
int (*p)[3];
p=&A[0];//指向第一行
for(int i=0; i<3; i++){// (*p)等同于A[0],p++的话是A[1],A[2]
(*p)[i];
*((*p)+j);
}
函数也有地址,函数是二进制指令
int (*fp)(const void *, const void *); //定义的声明的返回值和参数类型要和函数一样
fp = &compare_int;// 函数compare_int(const void *a, const void *b)
//两种方式,ANSI C兼容两种方式
(*fp)(&x, &y);
fp(&x, &y);
引用就是给变量取了一个别名,引用是C++专属特性,引用可以定义多个,引用有自己的空间
int x = 10;
iny &y = x;
y = z;//y无法指向z
//别名很像常指针
//int &b = a; int * const b = &a;
常引用让变量引用变成已读,不能通过引用对变量进行修改
a = 10;
const int &b = a;
常见错误
char input[32];
char *p1 = input;
do{
gets(input);
//p1 = input;
while(*p1) printf("%c", *p1++);//第二次之后无法打印
}while(strcmp(input, "done")!=0);
_getch不需要按下回车即可直接读取,同时不回显