C/C++ 各种功能学习笔记

本文介绍了C++中关于字符串的小知识,如constchar*与char*的区别,以及字符串读取和操作函数。还涉及文件操作的fgetc函数,基本输入输出流的cin使用,以及如何链接和操作数据库。此外,讨论了时间处理,类型转换,如char到int的转换,和VS2019中fopen的安全警告处理。最后提到了创建可执行文件及实现多线程的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.C/C++关于字符串

1.1 字符串小知识

        1.1.1 const char* 变量不可以赋值char* 变量

        1.1.2 字符串自动读取到 \t停止

1.2 字符串操作函数

        1.2.1 strcpy 拷贝字符串

        1.2.2 strcmp 比较字符串

1.3 文件操作函数

        1.3.1 fgetc 文件读取单个字符

1.4 基本输入输出流

        1.4.1 cin C++ 中的标准输入流

2.C/C++关于数据库

2.1 链接数据库

 2.2 实现数据库语句

3. C/C++关于时间

3.1 获取系统当前时间的年月日

3.2 时间字符串的拆分与组合

        3.2.1 sscanf将时间字符串拆分成一个个变量

        3.2.2 sprintf将一个个变量组合成时间字符串

4.C/C++关于类型转换

4.1普通的类型转换

        4.1.1char到int的转换

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。

6.C/C++扩展功能

6.1 vs2019创建可执行文件exe

6.2 c++创建多线程,并持续执行


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将时间字符串拆分成一个个变量

基础教学:

C++ 字符串转时间 与 时间转转字符串_sunwake999的博客-优快云博客

sscanf函数使用详解_faihung的博客-优快云博客

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的转换

基础教学:

C++程序 – char到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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈不收

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值