目录
1.1.1 const char* 变量不可以赋值char* 变量
1.C/C++关于字符串
1.1 字符串小知识
1.1.1 const char* 变量不可以赋值char* 变量
当函数的参数类型为char*时,他将无法被一个const char*类型的值所赋值
int main_Operate::rte_number(char* Name);
rte_number("data/student_fill.txt");
//调用失败 const char* 类型的实参和 char* 类型的形参不兼容
int main_Operate::rte_number(const char* Name); //修改后调用成功
1.1.2 字符串自动读取到 \t停止
%[^\t] 占位符可以一直读取文本,直到读到\t为止。这个\t是可以更改的,改成\n则为直到读到\n为止
char text[50];
fscanf("%[^\t]",text); //直到读到\t才停止
1.2 字符串操作函数
1.2.1 strcpy 拷贝字符串
是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 '\0' 也复制到目标空间
更详细的文章请看:【C语言】strcpy()函数_Candysrf的博客-优快云博客
strstr(this->file[i].code_color, "红") //code_color 为char数组
1.2.2 strcmp 比较字符串
参数:strcmp(str1,str2);
str1=str2时,返回零;str1>str2时,返回正数;str1<str2时,返回负数;
strcmp比较字符串大小的方法是:从左到右,依次对字母的ASCII码的大小进行比较,遇到不一样的字符或'\0'结束。
if (strcmp(tmp,"学号填空:\n") == 0){ //tmp为char数组
scanf("%s", &number);
}
1.3 文件操作函数
1.3.1 fgetc 文件读取单个字符
fgetc函数返回的字符实际上是文件流中位置指针指向的字符。当fgetc函数读取错误时,返回EOF并设置文件错误标志位。该函数以无符号char强制转换为int的形式返回读取的字符,如果到达文件末尾或出现读错,则返回EOF。可以用char或者int类型接收。
//不断读取fp文件中的每一个字符,赋值给ch。当ch为EOF时则退出循环
while (EOF != (ch = fgetc(fp)))
{
if (ch == '\n')
i++;
}
1.4 基本输入输出流
1.4.1 cin C++ 中的标准输入流
cin代表标准输入设备,使用右移运算符 ">>" 从设备键盘取得数据,送到输入流对象cin中,然后送到内存。使用cin可以获得多个从键盘的输入值,其具体使用格式如下:
cin >> 表达式1 >>表达式2...>> 表达式n;
printf("请输入您的用户名:");
cin >> account_name;
printf("请输入您的密码:");
cin >> password;
2.C/C++关于数据库
2.1 链接数据库
基础教学:
c++ 连接mysql数据库_c++连接mysql数据库_爱笑的蛐蛐的博客-优快云博客
1.把mysql中的include头文件和lib库文件放入到c++项目工程中,我的路径是:C:\Program Files\MySQL\mysql-8.0.22-winx64\ include | lib
2.到 VC++ 目录 中的包含目录和库目录分别加入include文件和lib文件的路径
3.到 链接器->输入 中的附加依赖项中 加入 libmysql.lib 的依赖
//固定不变的
MYSQL mysql; //一个数据库结构体
//初始化数据库
mysql_init(&mysql);
//设置编码方式
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
//连接数据库 //ip地址 //用户名 //密码 //数据库名
if (mysql_real_connect(&mysql, "localhost", "root", "123456", "bool_manage", 3306, NULL, 0) == NULL)
{
printf("错误原因:%s\n", mysql_error(&mysql)); //返回链接错误原因
printf("连接失败\n");
exit(-1);
}
2.2 实现数据库语句
基础教学:
1.在2.1的代码基础上,创建一个用于返回结构体和接受数据的结构体变量
2.调用相应的函数进行使用
mysql_query(&mysql, "select * from user_table");
//获取结果集
res = mysql_store_result(&mysql);
//给ROW赋值,判断ROW是否为空,不为空就打印数据
while (row = mysql_fetch_row(res))
{
if (strcmp(row[3], account_name) == 0 && strcmp(row[4], password) == 0)
{
strcpy(user_name, row[1]);
strcpy(user_sex, row[2]);
return 2;
}
}
3. C/C++关于时间
3.1 获取系统当前时间的年月日
基础教学:
C++ 获取系统当前时间_c++获取当前时间_中国彭于晏杭州分晏的博客-优快云博客
1.定义头文件<iostream>,使用命名空间std:using namespace std;
2.创建结构体tm的变量还有时间变量time_t
time_t now = time(0);
tm* ltm = localtime(&now);
//年 //月 //日
sprintf(start_time, "%d-%d-%d", 1900 + ltm->tm_year, 1 + ltm->tm_mon, ltm->tm_mday);
//年月日 时分秒
printf("%d/%d/%d %02d:%02d:%02d\n", 1900 + p->tm_year, 1 + p->tm_mon,
p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);//2021/5/11 14:04:44
3.2 时间字符串的拆分与组合
3.2.1 sscanf将时间字符串拆分成一个个变量
基础教学:
int year = 0,moon = 0,sun = 0;
sscanf(row[5], "%d-%d-%d", &year, &moon, &sun); //row[5]为时间字符串
3.2.2 sprintf将一个个变量组合成时间字符串
基础教学:
1.在3.2.1的基础上,将年月日三个变量重新组合成时间
sprintf(stop_time, "%d-%d-%d", year, moon, sun);
4.C/C++关于类型转换
4.1普通的类型转换
4.1.1char到int的转换
基础教学:
1.用强转int('c')
2.使用使用 static_cast<int>
3.使用sscanf函数
//强转
char ch = 'A';
cout << int(ch);
return 0;
//static_cast类型转换
char ch = 'A';
int N = static_cast<int>(ch);
cout << N;
//使用sscanf
const char *s = "1234";
int x;
sscanf(s, "%d", &x);
5.C/C++关于报错
5.1环境 VS2019
5.1.1 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. 此函数或变量可能不安全。请考虑改用fopen_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。
解决方案:在文件的最上一行添加该预定义代码
#define _CRT_SECURE_NO_DEPRECATE
6.C/C++扩展功能
6.1 vs2019创建可执行文件exe
基础教学:
【C++】| 将程序打包成可执行文件(.exe)| Visual Studio_c++程序打包成exe_Xunlan_的博客-优快云博客
1.在VS扩展商店搜索并下载 Microsoft Visual Studio Installer Project
2.点击 右键
解决方案
—添加
—新建项目
->创建 Setup Project 项目->右键Application Folder
->Add
->项目输出
->右键项目->重新生成->打开资源文件夹->看到一个msi文件->双击安装即可3.上面是我自己的创建方法,大家环境不同的可以点进链接对照文章内容再进行修改
遇到的问题:
1.写的是图形库编程,在安装好后打开exe文件并没有显示图片,需要把图片库资源一起拷贝到程序中,然后重新执行有效。
6.2 c++创建多线程,并持续执行
基础教学:
https://www.cnblogs.com/zizbee/p/13520823.html#21-%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B
1.引入头文件#include<thread>
2.实例化一个 thread 的对象,并传递一个参数,这个参数就是用于多线程的函数名
3.创建完对象之后便会开始执行,但只会执行一遍,要多次执行代码里的内容需要添加while循环并在里面添加退出的条件,便可以不停的执行啦
//定时器案例
//计时器输出
void timer_output()
{
int hour = 0, min = 0, sec = 0;
int cnt = 0;
while (true)
{
if (!model_select)
{
hour = cnt / 3600; //获取计时小时数
min = cnt / 60; //获取计时分钟数
sec = cnt % 60; //获取计时秒数
char str[50] = "";
sprintf(str, "计时器:%02d:%02d:%02d", hour, min, sec);
settextcolor(WHITE);
settextstyle(30, 0, str);
clearrectangle(200, 50, 800, 80);
outtextxy(200, 50, str);
Sleep(1000); //1s延时
cnt++;
if (status != 1)
break;
}
}
return;
}
int main()
{
thread th2(timer_output);
}