VC++基础学习

清屏

​
#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不需要按下回车即可直接读取,同时不回显

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值