目录

C++知识点(一)

C++知识点(一)

L"“替换成_T(”")

使用正则表达式

1
2
查找 L(\".+?\")
替换成 _T($1)

阻断函数

1
2
getchar()	//等待键盘输入回车
sysem("pause")//任意键继续

常用函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#pragma once	//防止头文件被重复编译
#pragma warning(disable:4996)//忽略C4996错误

printf("Hello World!")	//输出函数
atoi(arg)	//字符串转整数
Sleep(arg)	//等待
MessageBeep(1);	//播放系统音乐,方便OD定位
__declspec(naked)  //裸体函数

void *memcpy(void *str1, const void *str2, size_t n)
//内存copy(读取与写入)
//str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
//str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
//n -- 要被复制的字节数。
//返回值 -- 该函数返回一个指向目标存储区 str1 的指针。

void *memset(void *s, int ch, size_t n);
//内存设置
//将s中当前位置后面的n个字节,用 ch 替换并返回 s 。

size_t strlen(const char *string);
//计算给定字符串的长度 (ANSI)

size_t wcslen(const wchar_t * str);
//strlen函式的宽字节版 (Unicode)

BOOL CloseHandle(
  HANDLE hObject	//对象句柄
);//关闭对象句柄。

setlocale(LC_ALL, "chs");
//需要实现本地化,以实现中文正常输出

GetLastError();
//最后一次的出错代码

用汇编来调用CALL

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
int pcall =(int)MessageBoxC;
__asm
{
  push 0	//4
  push 0	//3
  push 0	//2
  push 0	//1
  
  call dword ptr ds:[MessageBoxA]	//第一种
  
  mov eax,MessageBoxB
  call eax	//第二种
    
  call pcall	//第三种
  
  ;分号 注释语句
}

ds 为数据段寄存器

循环

1
2
break;	//退出循环
continue;	//跳到循环首部,循环继续

其它

_In_ 表示是一个输入参数

_Out_ 表示是一个输出参数

&arg 引用

1.必须传变量
2.会影响被引用的变量原本的值

&变量 取变量地址运算符

*arg 指针

1.会影响被引用的变量原本的值

冒号:

冒号代表标签,常用于goto跳转

typedef

关键字,作用是为一种数据类型定义一个新名字
按照惯例,定义时会大写字母,以便提醒用户类型名称是一个象征性的缩写

三元运算子

条件式 ? 条件式为true时执行的陈述句 : 条件式为false时执行的陈述句

1
2
3
4
5
6
int ret, a = 10, b = 11;
bool flag = true;
if (flag)
    ret = a;
else
    ret = b;

等价于

1
ret = flag ? a : b;

const

声明变量是不变的

define

定义宏,可用于起别名,也可带参数,如

1
#define hanshu(a,b) (a+b)

指针

LPSTR char*
LPCSTR const char*
LPCTSTR const TCHAR*
LPTSTR TCHAR*

LP = 指针

C = const 只读

TSTR = TCHAR

HINSTANCE

“句柄型”数据类型。

static

关键字 定义静态变量或静态函数,生存周期和全局变量一样,作用域和局部变量一样,初始化仅执行一次.

多字节字符串(char)及常用函数

char* 定义字符串

1
2
3
4
char p[256]="hijk";	//可读写
char src2[]="opq";	//可读写

char *p="abcd";	//只读 

strcpy 字符串复制(wcscpy宽字节版)

1
char *strcpy(char* dest, const char *src);

把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间

strcpy_s 带有检测缓冲区的功能,更实用

strcat 字符串连接(wcscat宽字节版)

1
extern char *strcat(char *dest, const char *src);

strcat_s 带有检测缓冲区的功能,更实用

strstr 查找字符串(wcsstr宽字节版)

1
string strstr( string1string2)

​ strstr返回一个指针,指向string2在string1中首次出现的位置。

strchr 查找字符(wcschr宽字节版)

1
char *strchr(const char *str, int c)

在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。

strcmp 字符串比较(wcscmp宽字节版)

1
extern int strcmp(const char *s1,const char *s2);

当s1<s2时,返回为负数;

当s1=s2时,返回值= 0;

当s1>s2时,返回正数.

c_str() string转const char*

以下仅了解

strrev

strncmp

strncmpi

strerror

strncpy

strnicmp

Unicode字符串(wchar)及常用函数

wchar_t 宽字符

1
2
3
4
5
wchar_t c1='A';	//单个字符不用加"L"
wchar_t wStr[]=L"这是一段中文";	//字符串前要加"L"

wchar_t appName[5]=TEXT("test");
//可以用TEXT()方法将char转换成wchar_t

char是8位字符类型,wchar_t数据类型一般为16位或32位,wchar_t所能表示的字符数远超char型。

  1. 如果你想使用ANSI字符串,那么请使用这一套写法:
1
2
 char szString[100];
 strcpy(szString,"test");
  1. 如果你想使用Unicode字符串,那么请使用这一套:
1
2
 wchar_t szString[100];
 wcscpyszString,L"test");
  1. 如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:
1
2
 TCHAR szString[100];
 _tcscpy(szString,_TEXT("test"));

相关函数见 多字节字符串(char)及常用函数

TCHAR兼容型字符串及常用函数

TCHAR ANSI Unicode
TCHAR char wchar_t
_tcscpy() strcpy() wcscpy()
_tmain() main() wmain()
_tWinMain() WinMain() wWinMain()
_T"str" “str” L"str"
_tprintf() printf() wprintf()
_tcslen() strlen() wcslen()