C++入口函数Main接受的参数argc argv的作用和使用方法
argc 整型 保存接受的命令行参数的个数,含exe工具本身,所以至少等于1.
argv 字符指针数组 保存了 命令行各参数.
argv[1] 就是第一个命令行参数.
常见头文件的使用
include <iostream> 标准输入输出库,在使用cout cin时导入使用.
using namespace std; 在使用cout时可以将 std::cout 简写为 cout.
include <string> 字符串库, 使用字符串变量 std::string a = "sss";
C++关于内嵌汇编的写法于注意事项
string check_str = content.substr(0x18);
char* check_str_pointer = &check_str[0];
unsigned int check_num = 0;
__asm {
//初始化区域
mov rbx, 0
mov rcx, 0
mov rdx, 0x3C24
mov rax, check_str_pointer //不可以直接将变量赋值给r8寄存器
lea r8, [rax]
mov rax, 0
mov r9, 0
mov r10, 0x3C1C
//内嵌汇编执行体
monark_1234:
movzx ecx, byte ptr[r8]
lea r8, qword ptr[r8 + 0x1]
imul edx, r9d, 0x1F
inc rax
add edx, ecx
mov r9d, edx
cmp rax, r10
jne monark_1234
mov check_num, r9d //最后获取寄存器的值要保证数据的类型长度一致
}
return check_num;
C++有关操作字符串的函数
//字符串长度
str.length();
str.size();
//字符串插入值
str.insert(1,"aaa"); //在1的位置插入aaa
//字符删除
str.erase(2,4); //删除从2开始的4个字符,没有len就删除到末尾.
//字符追加
str.append("ddd");
//字符替换
str.replace(2,6,"ccc"); //从2的位置删除6个字符,并使用ccc替换
//查找
str.find("a"); //查找 s 中 a 第一次出现的位置
str.rfind("a"); //查找 s 中 a 最后一次出现的位置
str1.find_first_of("a"); //在 s 中查找 a 中任何一个字符最早出现的位置
str1.find_last_of("a"); //在 s 中查找 a 中任何一个字符最晚出现的位置
str1.find_first_not_of("a"); //查找 s 中 第一个不在 a 中的字符的位置
str1.find_last_not_of("a"); //查找 s 中 最后一个不在 a 中的字符的位置
//字符串转数字 转为整型
stoi("16"); 转化为 16
stoi("16",nullptr,8); 八进制转化
stoi("16",nullptr,16); 16进制转化
stoi("16",nullptr,2); 二进制转化
//转为浮点型
stof("16.22");
stod("16.323422343432");
stold("16.34343"); //long double
变量名: 是一个标识符,指代一块内存区域,它不是内存地址.它只是给编译器看的,计算机并不存储变量名.
C++中数组 使用大括号表现数组内容 int arrs[] = {0,1,2,3,4}
__int64 是C++中定义64位整型的类型.
__fastcall 指定了函数调用约定,它和stdcall类似. 函数的第一/第二参数由ecx / edx 传递,其他参数通过从右向左的顺序入栈.
C++开发中一定要注意不能出现同名变量.
对于 R8~R15 寄存器,我们可以使用 r8, r8d, r8w, r8b 分别代表 r8 寄存器的64位、低32位、低16位和低8位。
rax-64 eax-32 ax-16 ah-8 al-8
C++中关于内存中数据到底时什么类型的分析
内存中存的是二进制数据,至于在某个内存地址下存的到底时字符数据还是整型数据,这个从内存数据本身是看不出来的,而要看跳转的指针类型是什么,指针是整型,就是读取4字节数据,指针是字符型就是读取1字节内容.
//可以通过修改指针类型,修改内存数据
string chars = "abcdefghijklmn";
int * point = reinterpret_cast<int *>(&chars[1]);
*point = 61;
cout << chars << endl; //输出:a=fghijklmn 61刚好就是=
有关字符指针和数组的关系
一篇很棒的文章, [深入 char ,char ,char a[ ] ,char a[] 内核](https://blog.csdn.net/daiyutage/article/details/8604720)
C++ 打开二进制文件操作
#include <fstream>
//代码区域
fstream fop(filename,ios::binary); //如果这里不使用binary方式,读取的数据遇到0x1A这种字符信息,就会当作EOF/终止符 来看待. 导致获取的数据不能全部读取出来.
if(fop.fail()){
cout << "文件打开失败" << endl;
}
说明1: 这里的filename,可以是绝对路径比如"D:\files\a.bat"; 也可以直接写文件名,比如"b.bat",这个时候b.bat文件需要放置在于main.cpp文件同一目录下才可以找到.
//文件流的读取指针位置控制
fop.seekg(0,ios::end); //文件末尾
streamop pos = fop.tellg(); //开始到当前指针的距离
int file_size = pos; //这样可以获得文件大小
fop.seekg(0,ios::beg); //文件开始
将文件的信息读取出来存入字符串变量
string file_content;
file_content = string(istreambuf_iterator<char>(fop), istreambuf_iterator<char>());
fop.close();//不适用文件一定要关闭它.
写入文件的操作
ofstream fop(filename, ios::binary);
const char* data = &file_content[0];
const size_t size = file_content.length(); //文件的尺寸使用size_t类型,保证不同系统上的兼容性.
fop.write(data,size);
fop.close();