当前位置: 首页 > news >正文

3.1 C/C++ 使用字符与指针

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

strtok 字符串切割: 将指定的一段字符串,根据指定的分隔符进行切割,切割后分别存入到新数组.

#include <stdio.h>int main(int argc, char* argv[])
{char str[] = "hello,lyshark,welcome";char *ptr;ptr = strtok(str, ",");while (ptr != NULL){printf("切割元素: %s\n", ptr);ptr = strtok(NULL, ",");}char str[] = "192.168.1.1";char *ptr;char *SubAddr[4] = {0};ptr = strtok(str, ".");for (int x = 0; x < 4; x++){SubAddr[x] = ptr;ptr = strtok(NULL, ".");}for (int x = 0; x < 4; x++)printf("%s \n", SubAddr[x]);system("pause");return 0;
}

strcpy 字符串拷贝: 将一个字符串数组中的数据拷贝到新的字符串空间中,拷贝知道遇到结束符为止.

#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{char Array[] = "hello lyshark";char tmp[100];// 学习strcpy函数的使用方式if (strcpy(tmp, Array) == NULL)printf("从Array拷贝到tmp失败\n");elseprintf("拷贝后打印: %s\n", tmp);// 清空tmp数组的两种方式for (unsigned int x = 0; x < strlen(tmp); x++)tmp[x] = ' ';memset(tmp, 0, sizeof(tmp));// 学习strncpy函数的使用方式if (strncpy(tmp, Array, 3) == NULL)printf("从Array拷贝3个字符到tmp失败\n");elseprintf("拷贝后打印: %s\n", tmp);system("pause");return 0;
}

strcat 字符串连接: 将由src指向的字节串的副本,追加到由dest指向的以空字节终止的字节串的末尾.

#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{char str1[50] = "hello ";char str2[50] = "lyshark!";char * str = strcat(str1, str2);printf("字符串连接: %s \n", str);str = strcat(str1, " world");printf("字符串连接: %s \n", str);str = strncat(str1, str2, 3);printf("字符串连接: %s \n", str);system("pause");return 0;
}

strcmp 字符串对比: 对比两个字符串是否一致,如果一致返回真否则返回假,此外如需要对比指定长度,可用strncmp()函数.

#include <stdio.h>
#include <string.h>int Str_Cmp(const char * lhs, const char * rhs)
{int ret = strcmp(lhs, rhs);if (ret == 0)return 1;elsereturn 0;
}int main(int argc, char* argv[])
{char *str1 = "hello lyshark";char *str2 = "hello lyshark";int ret = Str_Cmp(str1, str2);printf("字符串是否相等: %d \n", ret);if (!strncmp(str1, str2, 3))printf("两个字符串,前三位相等");system("pause");return 0;
}

strshr 字符串截取: 该函数主要实现从指定位置开始向后截取,直到遇到结束符停止输出.

#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{const char buffer[32] = "hello lyshark welcome";const char needle[10] = "lyshark";const char* ret;ret = strstr(buffer, needle);printf("子字符串是: %s \n", ret);system("pause");return 0;
}

sprintf 格式化字符串: 该函数主要实现了对一段特定字符串进行格式化后并写入到新的缓冲区内.

#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{// 格式化填充输出char buf[30] = { 0 };sprintf(buf, "hello %s %s", "lyshark","you are good");printf("格式化后: %s \n", buf);// 拼接字符串char *s1 = "hello";char *s2 = "lyshark";memset(buf, 0, 30);sprintf(buf, "%s --> %s", s1, s2);printf("格式化后: %s \n", buf);// 数字装换位字符串int number = 100;memset(buf, 0, 30);sprintf(buf, "%d", number);printf("格式化后: %s \n", buf);system("pause");return 0;
}

动态存储字符串: 首先分配二维指针并开辟空间,每次循环时开辟一维空间,并向其中写入字符串,最后循环输出.

#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{// 分配空间char **p = malloc(sizeof(char *)* 5);for (int x = 0; x < 5;++x){p[x] = malloc(64); memset(p[x], 0, 64);sprintf(p[x], "Name %d", x + 1);}// 打印字符串for (int x = 0; x < 5; x++)printf("%s \n", p[x]);// 释放空间for (int x = 0; x < 5; x++){if (p[x] != NULL)free(p[x]);}system("pause");return 0;
}

实现字串长度统计: 字符串长度的计算原理时循环判断字符串是否遇到了\0并每次递增,遇到后直接返回.

#include <stdio.h>
#include <string.h>// 自己实现的一个字符串统计函数
int MyStrlen(char * String)
{int length = 0;// 写法一while (*String++ != '\0')length++;// 写法二//while (String[length] != '\0')//  length++;return length;
}int main(int argc, char* argv[])
{char *StringA = "hello lyshark";char *StringB = "lyshark";char StringC[] = { 'l', 'y', 's', 'h', 'a', 'r', 'k','\0'};int string_len = strlen(StringA);printf("字符串长度: %d \n", string_len);int string_cmp = strlen(StringA) > strlen(StringB);printf("字符串大小比较: %d \n", string_cmp);int my_string_len = MyStrlen(StringC);printf("字符串长度: %d \n", my_string_len);system("pause");return 0;
}

实现字符串拷贝: 字符串拷贝函数其原理是将源地址中的数据依次复制到目标中.

#include <stdio.h>
#include <string.h>// 使用数组实现字符串拷贝
void CopyString(char *dest,const char *source)
{int len = strlen(source);for (int x = 0; x < len; x++){dest[x] = source[x];}dest[len] = '\0';
}// 使用指针的方式实现拷贝
void CopyStringPtr(char *dest, const char *source)
{while (*source != '\0'){*dest = *source;++dest, ++source;}*dest = '\0';
}
// 简易版字符串拷贝
void CopyStringPtrBase(char *dest, const char *source)
{while (*dest++ = *source++);
}int main(int argc, char* argv[])
{char * str = "hello lyshark";char buf[1024] = { 0 };CopyStringPtrBase(buf, str);printf("%s \n", buf);system("pause");return 0;
}

实现查找字符串: 查找字符串函数MyStrStr()实现了在指定字符串中寻找字串,找到后返回之后的数据.

#include <stdio.h>
#include <string.h>char * MyStrStr(char * dest, char *src)
{char * p = NULL;char * temp = src;while (*dest){p = dest;while (*dest == *temp && *dest){ dest++; temp++; }if (!*temp)return p;elsetemp = src;dest = p; dest++;}return NULL;
}int main(int argc, char* argv[])
{char *p = MyStrStr("hello lyshark", "shark");printf("找到子串: %s\n", p);system("pause");return 0;
}

实现字符串拼接: 自己实现字符串追加拼接,把String所指向的字符串追加到dest所指向的字符串的结尾.

#include <stdio.h>
#include <string.h>void MyStrCat(char * String, char * SubStr)
{  // 将指针移动到末尾while (*String != NULL)String++;// 开始拷贝while (*SubStr != NULL){*String = *SubStr;String++; SubStr++;}*String = '\0';
}int main(int argc, char* argv[])
{char String[100] = "hello";char * Sub = " lyshark";MyStrCat(String, Sub);printf("拼接字符串: %s\n", String);system("pause");return 0;
}

实现字符串去空格: 实现对字符串中空格的去除,循环判断原字符串是否有空格,如果有则跳过,没有则追加.

#include <stdio.h>
#include <string.h>char * RemoveSpace(char * String)
{char * start = String;char * end = String + strlen(String) - 1;while (*end == ' ' && end > start)end--;*(end + 1) = '\0';while (*start == ' ' && start < end)start++;return start;
}int main(int argc, char* argv[])
{char str[] = "    hello lyshark    ";char *ptr = RemoveSpace(str);printf("原字符串: %s 新字符串: %s \n", str,ptr);system("pause");return 0;
}

实现字符串逆序: 实现将指定的字符串逆序,其原理是将字符串首尾互换位置,循环更改原字符串.

#include <stdio.h>
#include <string.h>void Strswap(char *Array)
{int len = strlen(Array);char *p1 = Array;char *p2 = &Array[len - 1];while (p1 < p2){char tmp = *p1;*p1 = *p2;*p2 = tmp;p1++, p2--;}
}int main(int argc, char* argv[])
{char str[20] = "hello lyshark";Strswap(str);for (int x = 0; x < strlen(str); x++)printf("%c", str[x]);system("pause");return 0;
}

实现字符串截取: 实现在参数String所指向的字符串中搜索第一次出现字符ch的位置,并输出其后内容.

#include <stdio.h>
#include <string.h>char * MyStrchr(const char *String, char ch)
{char *ptr = String;while (*ptr != '\0'){if (*ptr == ch)return ptr;ptr++;}return NULL;
}int main(int argc, char* argv[])
{char Str[] = "hello lyshark";char ch = 's';char *ptr = MyStrchr(Str, ch);printf("输出结果: %s \n", ptr);system("pause");return 0;
}

字符串首字母排序: 实现传入一个指针数组,函数将根据字符串第一个字母进行排序,排序影响原数组.

#include <stdio.h>
#include <string.h>void bubble(char **Str, int len)
{for (int x = 0; x < len - 1; x++){for (int y = 0; y < len - x - 1; y++){if (**(Str + y) < **(Str + y + 1)){char * tmp = *(Str + y);*(Str + y) = *(Str + y + 1);*(Str + y + 1) = tmp;}}}
}int main(int argc, char* argv[])
{char *Str[] = { "csdfw", "qwesfae", "retyu", "wsf" };int len = sizeof(Str) / sizeof(char *);bubble(Str,len);for (int x = 0; x < len; x++)printf("%s \n", Str[x]);system("pause");return 0;
}

实现字符串的匹配: 该函数与strchr()类似,不过当StringMatch()函数匹配成功后会返回一个位置而不是字符串.

#include <stdio.h>
#include <string.h>int StringMatch(char *String, char *SubString)
{int x, y, start = 0;int str_len = strlen(String) - 1;    // 得到主字符串长度int sub_len = strlen(SubString) - 1; // 得到子字符串长度int end_match = sub_len;for (y = 0; end_match <= str_len; end_match++, start++){if (String[end_match] == SubString[sub_len]){for (y = 0, x = start; y < sub_len && String[x] == SubString[y];)x++, y++;}if (y == sub_len)return (start + 1);}if (end_match > String)return -1;
}int main(int argc, char* argv[])
{char str[] = "hello lyshark welcome !";char sub[] = "lyshark";int ret = StringMatch(str, sub);if (ret != -1){printf("匹配到,字符间隔: %d \n", ret);}system("pause");return 0;
}

统计字符串字符个数: 实现循环一段字符串,每次取出一个字符并判断该字符是字母数组还是空格.

#include <stdio.h>
#include <string.h>void String_Count(char *String)
{int letter = 0, digit = 0, space = 0, other = 0;int len = strlen(String);for (int x = 0; x < len; x++){char ch = (char)String[x];if (ch != EOF){if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')letter++;else if (ch >= '0' && ch <= '9')digit++;else if (ch == ' ')space++;elseother++;}}printf("字符: %d -> 数字: %d -> 空格: %d -> 其他: %d \n", letter, digit, space, other);
}int main(int argc, char* argv[])
{char *str = "hello lyshark !@#$ 123456";String_Count(str);char *str1 = "please input &*(123";String_Count(str1);system("pause");return 0;
}

指针实现字符串排序: 实现通过指针判断字符串位置,排序将按照A-Z的顺序进行.

#include <stdio.h>
#include <string.h>void String_Sort(char *String[],int len)
{char *temporary;int x, y;for (x = 0; x < len; x++){for (y = x + 1; y < len; y++){if (strcmp(String[x], String[y]) > 0){temporary = String[x];String[x] = String[y];String[y] = temporary;}}}
}int main(int argc, char* argv[])
{char *str[] = { "CPP", "Basic", "LyShark", "Hello", "Great" };char **ptr = str;String_Sort(str, 5);for (int x = 0; x < 5; x++)printf("%s \n", str[x]);system("pause");return 0;
}

实现字符串替换: 实现将string缓冲区里面的字符串{}符号,替换为%d字符.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>int ReplaceStr(char* sSrc, char* sMatchStr, char* sReplaceStr)
{int StringLen;char caNewString[64];char* FindPos;FindPos = (char *)strstr(sSrc, sMatchStr);if ((!FindPos) || (!sMatchStr))return -1;while (FindPos){memset(caNewString, 0, sizeof(caNewString));StringLen = FindPos - sSrc;strncpy(caNewString, sSrc, StringLen);strcat(caNewString, sReplaceStr);strcat(caNewString, FindPos + strlen(sMatchStr));strcpy(sSrc, caNewString);FindPos = (char *)strstr(sSrc, sMatchStr);}free(FindPos);return 0;
}int main(int argc, char **argv)
{char string[] = "192.168.1.{}";BOOL ret = ReplaceStr(string, "{}", "%d");if (ret == 0)printf("%s \n", string);system("pause");return 0;
}

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/a11c68a9.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章:

3.1 C/C++ 使用字符与指针

C/C语言是一种通用的编程语言&#xff0c;具有高效、灵活和可移植等特点。C语言主要用于系统编程&#xff0c;如操作系统、编译器、数据库等&#xff1b;C语言是C语言的扩展&#xff0c;增加了面向对象编程的特性&#xff0c;适用于大型软件系统、图形用户界面、嵌入式系统等。…...

[代码学习]einsum详解

einsum详解 该函数用于对一组输入 Tensor 进行 Einstein 求和&#xff0c;该函数目前仅适用于paddle的动态图。 Einstein 求和是一种采用 Einstein 标记法描述的 Tensor 求和&#xff0c;输入单个或多个 Tensor&#xff0c;输出单个 Tensor。 paddle.einsum(equation, *opera…...

女性必看——“黄体破裂”到底有多可怕?

前几天的亚运会上发生了这样一件事&#xff1a; 雅思敏&#xff08;化名&#xff09;是一名国外皮划艇运动员&#xff0c;在亚运会上奋力完成皮划艇比赛后&#xff0c;突然开始 剧烈腹痛、面色苍白&#xff0c;大汗淋漓&#xff0c;经过进一步检查&#xff0c;确诊卵巢黄体破裂…...

colab切换目录的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

基于SSM的生活缴费系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

【WebLogic】WebLogic 2023年7月补丁导致JVM崩溃的解决方案

受影响版本&#xff1a; Oracle WebLogic 12c&#xff08;12.2.1.4.0&#xff09;Oracle WebLogic 14c&#xff08;14.1.1.0.0&#xff09; 问题描述&#xff1a; Oracle官方在2023年7月发布的最新版本的OPatch&#xff08;13.9.4.2.13&#xff09;存在一个新出现的Bug&#…...

简单OpenSL ES学习

初识OpenSL ES OpenSL ESObjects和Interfaces 所有的Object在OpenSl里面我们拿到的都是一个SLObjectItf&#xff1a;SLObjectItf_创建引擎创建过程要设计得这么麻烦&#xff1f;&#xff08;object的生命周期&#xff09;这么多参数&#xff0c;参数类型这么多学习障碍太大&…...

Linux网络编程- struct packet_mreq setsockopt()

struct packet_mreq struct packet_mreq 是一个数据结构&#xff0c;用于 Linux 中的原始数据包套接字&#xff0c;当我们想改变套接字的行为以接收特定类型的数据包时&#xff0c;它与 setsockopt() 函数配合使用。 下面是 struct packet_mreq 的定义&#xff1a; struct p…...

C++学习day4

作业&#xff1a; 1> 思维导图 2> 整理代码 1. 拷贝赋值函数课上代码 //拷贝赋值函数课上代码 #include<iostream> using namespace std;//创建类 class Stu { private://私有的string name;int socer;int *age;//此处注意用到指针类型 public://共有的//无参构…...

从零学算法54

54.给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c;然后再进入内部一层重复相同的步骤&#xff0c;直到…...

Logback日志框架使用详解以及如何Springboot快速集成

Logback简介 日志系统是用于记录程序的运行过程中产生的运行信息、异常信息等&#xff0c;一般有8个级别&#xff0c;从低到高为All < Trace < Debug < Info < Warn < Error < Fatal < OFF off 最高等级&#xff0c;用于关闭所有日志记录fatal 指出每个…...

Nginx概念

Nginx概念 Nginx 是一款面向性能设计的 HTTP 服务器&#xff0c;相较于 Apache、lighttpd 具有占有内存少&#xff0c;稳定性高等优势&#xff0c;同时也是一个非常高效的反向代理、负载平衡服务器 nginx使用的是反应器模式&#xff0c;主事件循环等待操作系统发出准备事件的信…...

vim基础指令(自用)

这个是自己随便写的&#xff0c;类似于笔记 vim 多模式编辑器 查看指令&#xff1a; gg&#xff1a; 定位光标到最开始行 shift(按)g 定位到最结尾行 nshift(按)g 定位到任意行 shift&#xff04; 定位到本行结尾 0 定位到本行开头 w&#xff1a;跨单词移动 h.j.k,l: 左下上右 …...

【centos7安装ElasticSearch】

概述 最近工作中有用到ES &#xff0c;当然少不了自己装一个服务器捣鼓。本文的ElasticSearch 的版本&#xff1a; 7.17.3 一、下载 ElasticSearch 点此下载 下载完成后上传至 Linux 服务器&#xff0c;本文演示放在&#xff1a; /root/ 下&#xff0c;进行解压&#xff1…...

ElementPlus Switch 开关基础使用

昨天开发用到开关组件 后台返回字段是 can_write 默认是0 or 1 但是Switch 组件绑定的默认值默认是 true or false 直接绑定会导致默认是关闭状态 在页面一加载 值发生变化时 会自己调用 查了文档 需要使用 active-value 和 inactive-value 来指定绑定的数据类型 …...

Spring Boot:自定义注解--annotation

目录 自定义注解的定义和作用范围如何创建自定义注解创建注解接口 如何使用自定义注解进行数据验证创建注解处理器控制器中使用注解 如何为字段添加注解 自定义注解的定义和作用范围 自定义注解可以作用在类、方法、属性、参数、异常、字段或其他注解上。 如何创建自定义注解…...

WIFI频段

问题&#xff1a; 5ghzwifi频段带宽怎么选 智造喵回答&#xff1a; 选择5GHz WiFi频段的带宽取决于你的网络需求和设备兼容性。通常有两种可选的带宽&#xff1a;20MHz和40MHz。 20MHz带宽&#xff1a;这是较为常见的 WiFi 频段带宽设置。它提供较好的穿墙能力和信号稳定性…...

Java的引用详解与示例

引用的作用 在Java中&#xff0c;引用&#xff08;Reference&#xff09;是一种重要的概念&#xff0c;它们用于管理对象的生命周期、内存分配和垃圾回收。引用的作用包括以下几个方面&#xff1a; 内存管理&#xff1a;引用帮助Java虚拟机&#xff08;JVM&#xff09;管理内存…...

c++视觉处理---霍夫变换

霍夫直线变换的函数 HoughLines 是OpenCV库中用于执行霍夫直线变换的函数。霍夫直线变换用于检测图像中的直线。下面是该函数的基本用法&#xff1a; cv::HoughLines(image, lines, rho, theta, threshold);image: 输入的二值图像&#xff0c;通常是通过边缘检测算法生成的。…...

el-table 边框颜色修改 简单有效!

废话不多说&#xff0c;直接上图 &#xff08;1&#xff09;修改前的图如下&#xff1a; 以上是elementUI原组件自带的样式 &#xff08;2&#xff09;下面是修改后的边框图如下&#xff1a; 源码如下&#xff1a; <el-table :data"jctableData" border size…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...