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

【C语言篇】C 语言总复习(下):点亮编程思维,穿越代码的浩瀚星河

在这里插入图片描述
在这里插入图片描述

我的个人主页
我的专栏C语言,希望能帮助到大家!!!点赞❤ 收藏❤
在这里插入图片描述

在C语言的世界里,结构体和联合体以及文件操作都是非常重要且实用的知识板块,掌握它们能帮助我们更高效地组织数据以及与外部文件进行交互。今天,就让我们一同深入探究这些内容吧。

一、结构体与联合体

(一)结构体的定义与使用

1. 结构体类型的声明与结构体变量的定义、初始化

结构体允许我们将不同类型的数据组合在一起,形成一个新的自定义数据类型。例如,我们要描述一个学生的信息,可能包含姓名(字符数组类型)、年龄(整型)和成绩(浮点型)等不同类型的数据,就可以这样声明结构体类型:

struct Student {char name[20];int age;float score;
};

声明好结构体类型后,我们可以定义结构体变量并进行初始化,像这样:

struct Student stu1 = {"Tom", 18, 85.5};
2. 结构体成员的访问与操作

一旦定义了结构体变量,我们就可以通过“.”操作符来访问其成员。例如,要获取stu1的姓名,可以使用stu1.name;要修改年龄,可以写成stu1.age = 19;,操作起来十分直观便捷,让我们能够灵活地处理结构体中各个成员的数据。

3. 结构体数组与结构体指针

有时候,我们需要处理多个同类型的结构体对象,这时候结构体数组就派上用场了。比如定义一个班级学生的结构体数组:

struct Student classStudents[30];

而结构体指针则可以更高效地操作结构体,特别是在函数传参等场景下,能够避免大量数据的复制。可以通过->操作符来访问结构体指针所指向结构体的成员,例如:

struct Student *pStu = &stu1;
pStu->age = 20;
4. 结构体作为函数参数与返回值

结构体可以作为函数的参数传递,不过要注意,如果结构体较大,直接传递可能会有性能损耗,这时候传递结构体指针会是更好的选择。同时,函数也可以返回结构体,方便我们从函数中获取多个相关的数据结果,例如:

struct Student createStudent(char *name, int age, float score) {struct Student newStu;strcpy(newStu.name, name);newStu.age = age;newStu.score = score;return newStu;
}

(二)联合体的概念与应用

1. 联合体的定义与特点(共享内存)

联合体和结构体有点类似,但它最大的特点是其所有成员共享同一块内存空间。也就是说,在某一时刻,联合体中只有一个成员的值是有效的,其定义形式如下:

union Data {int num;char ch;
};

例如,当我们给union Datanum成员赋值后,再去访问ch成员,其实就是从同一块内存按照不同的类型解读数据,这在一些内存空间有限且需要根据不同情况复用的场景很有用。

2. 联合体的使用场景

在嵌入式开发中,常常会遇到需要根据不同的配置或者状态来复用同一块内存区域存储不同类型数据的情况,联合体就能很好地满足需求。比如在通信协议解析中,接收到的数据可能根据不同的指令代表不同的数据类型,这时候可以利用联合体方便地进行处理。

二、文件操作

(一)文件的基本概念

1. 文件的类型(文本文件与二进制文件)

C语言中的文件主要分为文本文件和二进制文件。文本文件是以字符形式存储数据,便于人类阅读,每行以换行符等作为结束标志;而二进制文件则是按照数据在内存中的存储形式原样保存,更适合保存一些结构化的数据,比如结构体数组等,并且读写效率通常更高,不过可读性相对较差。

2. 文件指针与文件的打开与关闭(fopen、fclose函数)

文件指针是我们操作文件的关键,它指向了文件的相关信息结构体。通过fopen函数可以打开一个文件,例如:

FILE *fp = fopen("test.txt", "r");

这里"r"表示以只读方式打开文件。在使用完文件后,一定要记得用fclose函数关闭文件,释放相关资源,像这样:

fclose(fp);

(二)文件的读写操作

1. 字符读写函数(fgetc、fputc)

fgetc函数用于从文件中读取一个字符,而fputc则用于向文件中写入一个字符。例如,我们可以这样将一个字符写入文件:

fputc('A', fp);

再从文件中读取字符:

char ch = fgetc(fp);
2. 字符串读写函数(fgets、fputs)

fgets能够从文件中读取一行字符串,它会自动在读取到换行符或者达到指定长度时停止,使用起来很方便。fputs则可以将一个字符串写入文件,比如:

char str[] = "Hello World";
fputs(str, fp);
3. 格式化读写函数(fscanf、fprintf)

这两个函数类似于scanfprintf,不过它们是针对文件进行操作的。可以按照指定的格式从文件中读取数据或者向文件中写入数据,例如:

int num;
fscanf(fp, "%d", &num);
fprintf(fp, "%d", num);
4. 数据块读写函数(fread、fwrite)

如果要读写一块连续的数据,比如结构体数组等,freadfwrite就很实用了。它们可以按照指定的字节数来读写数据,像这样:

struct Student students[10];
fwrite(students, sizeof(struct Student), 10, fp);

(三)文件的定位与状态检测

1. 文件定位函数(fseek、ftell)

fseek函数可以用来改变文件指针的位置,实现随机读写的功能。例如,我们想将文件指针移动到文件开头,可以这样操作:

fseek(fp, 0, SEEK_SET);

ftell函数则能返回当前文件指针相对于文件开头的偏移量,方便我们知晓文件读取或写入的进度位置。

2. 文件状态检测函数(feof、ferror)

feof函数用于判断是否已经读到文件末尾了,而ferror函数则是用来检测在文件操作过程中是否出现了错误,便于我们及时处理异常情况,确保文件操作的正确性。

三、预处理指令

1. 宏定义

无参宏的定义与使用

无参宏是一种简单的文本替换机制,通过#define指令来定义。例如,定义一个表示圆周率PI的无参宏:

#define PI 3.14159

在编译预处理阶段,代码中所有出现PI的地方都会被替换为3.14159。它的优点是方便代码的修改和维护,如果需要改变PI的值,只需修改宏定义处即可,而不用在整个代码中逐一查找修改。

带参宏的展开规则与应用

带参宏可以像函数一样接受参数,但它本质上还是文本替换。例如,定义一个计算平方的带参宏:

#define SQUARE(x) ((x) * (x))

当使用SQUARE(5)时,在预处理阶段会展开为((5) * (5))。需要注意的是,参数在宏定义中要加上括号,以避免在复杂表达式中出现错误的运算顺序。例如,如果写成#define SQUARE(x) x * x,那么SQUARE(2 + 3)会展开为2 + 3 * 2 + 3,结果就不是预期的25了。带参宏常用于一些简单的、对性能要求较高且代码量较小的计算场景,因为它避免了函数调用的开销。

2. 文件包含指令

#include 的作用与用法

#include指令用于将指定的文件内容插入到当前源文件中。通常有两种形式:#include <文件名>#include "文件名"。尖括号形式用于包含标准库头文件,编译器会在系统指定的标准库路径中查找文件;双引号形式用于包含自定义头文件,编译器会先在当前源文件所在目录查找,如果找不到再去标准库路径查找。例如,要使用标准输入输出函数,就需要包含<stdio.h>头文件:

#include <stdio.h>

如果我们自己编写了一个头文件myheader.h,其中包含了一些自定义函数的声明,在使用这些函数的源文件中就可以使用#include "myheader.h"将其包含进来。

头文件的编写与组织

头文件一般包含函数声明、宏定义、结构体和联合体的声明等内容,但通常不包含函数的定义(除非是内联函数)。这样可以避免在多个源文件包含同一个头文件时出现重复定义的错误。例如,一个简单的头文件math_functions.h可以这样编写:

#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H// 函数声明
int add(int a, int b);
float multiply(float a, float b);// 宏定义
#define MAX_NUM 100#endif

这里使用了条件编译指令#ifndef#define来防止头文件的重复包含。

3. 条件编译指令

#ifdef、#ifndef、#else、#endif 的使用场景

#ifdef指令用于判断某个宏是否已经被定义,如果定义了则编译其后的代码块。例如:

#ifdef DEBUGprintf("Debug mode is on.\n");
#endif

如果在之前定义了DEBUG宏,那么就会打印调试信息。

#ifndef#ifdef相反,它判断某个宏是否未被定义。常用于头文件防止重复包含,如前面提到的math_functions.h中的用法。

#else可以与#ifdef#ifndef配合使用,提供另一种编译选择。例如:

#ifdef DEBUGprintf("Debugging information.\n");
#elseprintf("Release version.\n");
#endif
条件编译在程序调试与跨平台开发中的应用

在程序调试时,可以通过条件编译来选择性地编译调试代码。例如,在开发过程中定义DEBUG宏,将一些调试信息输出的代码包含在#ifdef DEBUG块中,在发布版本时去掉DEBUG宏的定义,这些调试代码就不会被编译进最终的可执行文件,从而减小文件大小并提高运行效率。

在跨平台开发中,不同的操作系统或硬件平台可能需要不同的代码实现。可以利用条件编译来针对不同平台编写特定的代码块。例如:

#ifdef WIN32// Windows 平台相关代码
#elif defined(__LINUX__)// Linux 平台相关代码
#else// 其他平台代码
#endif

四、内存管理

1. 动态内存分配函数

malloc、calloc、realloc 函数的使用

malloc函数用于从堆内存中分配指定字节数的连续空间,并返回指向该空间的指针。例如:

int *p = (int *)malloc(5 * sizeof(int));

这里分配了能存储 5 个int类型数据的空间,并将返回的指针强制转换为int *类型后赋值给p

calloc函数与malloc类似,但它会在分配内存后将内存空间初始化为 0。例如:

int *p = (int *)calloc(5, sizeof(int));

这会分配 5 个int类型大小的空间,并将其初始化为 0。

realloc函数用于重新调整已分配内存块的大小。例如:

int *p = (int *)malloc(5 * sizeof(int));
// 假设之后需要更多空间
p = (int *)realloc(p, 10 * sizeof(int));

它会尝试将p指向的内存块大小调整为能存储 10 个int类型数据的空间,如果原内存块后面有足够连续的空闲空间,会直接扩展;否则会重新分配一块足够大的内存空间,并将原内存块中的数据复制过去,然后释放原内存块。

动态内存分配的注意事项与错误处理

在使用动态内存分配函数时,必须检查返回值是否为NULL。如果返回NULL,表示内存分配失败,例如:

int *p = (int *)malloc(100000000 * sizeof(int));
if (p == NULL) {printf("Memory allocation failed!\n");// 可以进行一些错误处理,如退出程序或尝试释放其他资源exit(1);
}

另外,使用完动态分配的内存后,一定要使用free函数释放,以避免内存泄漏。例如:

int *p = (int *)malloc(5 * sizeof(int));
// 使用 p 指向的内存
free(p);
p = NULL; // 建议将指针赋值为 NULL,防止悬空指针

2. 内存泄漏与悬空指针

内存泄漏的原因与检测方法

内存泄漏是指程序中动态分配的内存空间在不再使用后没有被释放。常见的原因包括忘记调用free函数、错误的指针操作导致无法正确释放内存等。例如:

while (1) {int *p = (int *)malloc(100 * sizeof(int));// 这里如果没有合适的释放机制,每次循环都会分配新内存而不释放,导致内存泄漏
}

检测内存泄漏可以使用一些工具,如 Valgrind(在 Linux 系统下)。它可以监控程序的内存使用情况,检测出内存泄漏的位置和原因。

悬空指针的产生与危害

悬空指针是指指针所指向的内存已经被释放,但指针仍然存在。例如:

int *p = (int *)malloc(5 * sizeof(int));
free(p);
// 此时 p 就是悬空指针,如果继续使用 p,会导致未定义行为,可能会崩溃或产生错误的结果

悬空指针可能会导致程序崩溃、数据损坏或产生难以调试的错误,因此在释放内存后,应将指针赋值为NULL或者将指针的作用域限制在合理范围内,避免其成为悬空指针。

五、C 语言综合应用与调试技巧

1. 综合项目案例分析

小型 C 语言项目的架构与实现思路

以一个简单的学生成绩管理系统为例,其架构可以包括数据存储模块(用于存储学生信息和成绩,可能使用结构体数组或链表)、数据输入输出模块(负责从用户获取数据和显示数据)、数据处理模块(如计算平均成绩、排序等)。

实现思路上,首先定义结构体来表示学生信息:

struct Student {char name[20];int id;float score;
};

数据存储模块可以定义一个结构体数组来存储多个学生的信息:

struct Student students[100];

数据输入输出模块可以使用scanfprintf函数来实现与用户的交互,例如:

printf("Enter student name: ");
scanf("%s", students[i].name);

数据处理模块可以编写函数来计算平均成绩:

float averageScore(struct Student *students, int numStudents) {float sum = 0;for (int i = 0; i < numStudents; i++) {sum += students[i].score;}return sum / numStudents;
}
不同模块之间的协作与数据传递

在学生成绩管理系统中,数据输入输出模块获取用户输入的数据后,将其传递给数据存储模块进行存储。数据处理模块则从数据存储模块获取数据进行处理,并将处理结果返回给数据输出模块进行显示。例如,在计算平均成绩时,数据处理模块的averageScore函数接收数据存储模块中的students数组和学生数量作为参数,计算出平均成绩后,数据输出模块将其打印出来:

float avg = averageScore(students, numStudents);
printf("Average score: %.2f\n", avg);

2. 程序调试方法与工具

使用调试器(如 gdb)进行程序调试

使用gdb调试器,首先要在编译程序时加上-g选项,以便生成调试信息。例如:

gcc -g -o myprogram myprogram.c

然后启动gdb并加载可执行文件:

gdb myprogram

gdb中,可以设置断点,例如在某一行代码处设置断点:

break 10

然后运行程序:

run

当程序运行到断点处时,会暂停,可以查看变量的值:

print variable_name

还可以单步执行程序(逐行执行):

next

或者进入函数内部单步执行:

step
常见错误类型(语法错误、逻辑错误、运行时错误)及排查方法
  • 语法错误:通常是由于违反了 C 语言的语法规则,如缺少分号、括号不匹配、变量未定义等。编译器在编译时会报告语法错误的位置和错误信息。排查方法是仔细查看编译器提示的错误信息,根据错误位置检查代码是否符合语法规范。例如,如果编译器提示“error: expected ‘;’ before ‘}’”,就需要检查对应的代码块,看是否遗漏了分号。
  • 逻辑错误:程序能正常编译运行,但结果不正确。这可能是由于算法错误、条件判断错误等原因。排查方法可以通过添加调试输出语句,打印关键变量的值,逐步分析程序的执行流程,找出逻辑错误的地方。例如,如果一个计算结果总是错误,可以在计算过程中的关键步骤打印中间变量的值,检查是否符合预期。
  • 运行时错误:如内存访问错误(越界访问、使用悬空指针等)、除以 0 等。这些错误通常在程序运行时才会出现,可能导致程序崩溃。排查方法可以使用调试器,如gdb,在程序崩溃时查看堆栈信息,确定错误发生的位置和原因。例如,如果程序因为访问非法内存地址而崩溃,gdb会显示相关的堆栈调用信息,帮助定位是哪一行代码导致了非法访问。

3. 代码优化与规范

C 语言代码优化的原则与策略
  • 减少不必要的计算:例如,避免在循环中进行重复的计算,如果某个表达式的值在循环过程中不变,可以将其提到循环外面计算一次。
  • 选择合适的数据结构和算法:根据问题的特点选择高效的数据结构和算法。例如,如果需要频繁地进行插入和删除操作,链表可能比数组更合适;如果需要快速查找元素,哈希表或二叉搜索树可能更高效。
  • 优化内存使用:合理使用动态内存分配,避免不必要的内存浪费。例如,如果知道一个数组的最大可能大小,可以预先分配足够的内存,而不是频繁地进行重新分配。
  • 编译器优化选项:使用编译器的优化选项,如gcc中的-O系列选项(如-O2-O3),让编译器自动对代码进行一些优化,但要注意可能会影响调试。
代码规范与风格的重要性及遵循的标准

良好的代码规范和风格可以提高代码的可读性、可维护性和可扩展性。例如,统一的命名规则(变量名、函数名采用有意义的名称,遵循驼峰命名法或下划线命名法)、合理的代码缩进(通常使用 4 个空格或一个制表符缩进)、适当的注释(对复杂的代码逻辑、函数功能等进行注释)。遵循一些行业标准,如 GNU 编码标准或公司内部的代码规范,可以使代码更易于团队协作开发和后续的维护升级。例如:

// 这是一个计算两个数之和的函数
int addNumbers(int num1, int num2) {// 计算和int sum = num1 + num2;return sum;
}

这里函数名采用了有意义的名称,代码有适当的缩进,并且对函数功能进行了注释,符合基本的代码规范要求。

在这里插入图片描述

相关文章:

【C语言篇】C 语言总复习(下):点亮编程思维,穿越代码的浩瀚星河

我的个人主页 我的专栏&#xff1a;C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 在C语言的世界里&#xff0c;结构体和联合体以及文件操作都是非常重要且实用的知识板块&#xff0c;掌握它们能帮助我们更高效地组织数据以及与外部文…...

AI技术架构:从基础设施到应用

人工智能&#xff08;AI&#xff09;的发展&#xff0c;正以前所未有的速度重塑我们的世界。了解AI技术架构&#xff0c;不仅能帮助我们看懂 AI 的底层逻辑&#xff0c;还能掌握其对各行业变革的潜力与方向。 一、基础设施层&#xff1a;AI 技术的坚实地基 基础设施层是 AI 技…...

centos7的yum镜像源设置

sudo yum repolist 查看镜像源连接情况&#xff0c;not found即为连接失败 sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup 备份镜像源文件 sudo nano /etc/yum.repos.d/CentOS-Base.repo 进入镜像源文件编辑内容 # CentOS-Base.repo # # The mirror system uses the…...

Qt6开发自签名证书的https代理服务器

目标&#xff1a;制作一个具备类似Fiddler、Burpsuit、Wireshark的https协议代理抓包功能&#xff0c;但是集成到自己的app内&#xff0c;这样无需修改系统代理设置&#xff0c;使用QWebengineview通过自建的代理服务器&#xff0c;即可实现https包的实时监测、注入等自定义功能…...

HarmonyOS:多线程并发-Worker

Worker主要作用是为应用程序提供一个多线程的运行环境&#xff0c;可满足应用程序在执行过程中与宿主线程分离&#xff0c;在后台线程中运行一个脚本进行耗时操作&#xff0c;极大避免类似于计算密集型或高延迟的任务阻塞宿主线程的运行。具体接口信息及使用方法详情请见Worker…...

小程序IOS安全区域优化:safe-area-inset-bottom

ios下边有一个小黑线&#xff0c;位于底部的元素会被黑线阻挡 safe-area-inset-bottom 一 用法及作用&#xff1a; IOS全面屏底部有小黑线&#xff0c;位于底部的元素会被黑线阻挡&#xff0c;可以使用以下样式&#xff1a; .model{padding-bottom: constant(safe-area-ins…...

C++ 中多态性在实际项目中的应用场景

C中的多态性是面向对象编程中的一个核心概念&#xff0c;它允许我们在使用基类指针或引用的情况下&#xff0c;调用派生类对象的特定方法。这种特性在实际项目中有着广泛的应用场景&#xff0c;具体包括但不限于以下几个方面&#xff1a; 1.图形图像处理&#xff1a; 在图形图…...

prettier配置

配置 Prettier 在 VSCode 中自动格式化代码的教程 1. 安装 Prettier VSCode 插件 打开 VSCode。点击左侧活动栏的扩展市场图标(或按 Ctrl+Shift+X)。在搜索栏中输入 Prettier - Code formatter。找到插件并点击 Install 安装它。2. 配置 VSCode 设置 确保 VSCode 配置正确,…...

【基于OpenEuler国产操作系统大数据实验环境搭建】

大数据实验环境搭建 一、实验简介1.1 实验内容1.2 环境及其资源规划 二、实验目的三、实验过程3.1 安装虚拟机软件及操作系统3.2 创建安装目录&#xff08;在主节点上操作&#xff09;3.2 安装JDK及基本设置&#xff08;所有节点都需要操作&#xff09;3.3 安装Hadoop3.4 安装Z…...

期末软件经济学

文章目录 前言复习策略复习名词解释简答题第一章 ppt后记 前言 最近白天都在忙正事&#xff0c;晚上锻炼一下&#xff0c;然后处理一些杂事&#xff0c;现在是晚上十点多&#xff0c;还有一些时间复习一下期末考试。复习到十一点。 复习策略 感觉比较简单&#xff0c;直接刷…...

滑动窗口算法专题

滑动窗口简介 滑动窗口就是利用单调性&#xff0c;配合同向双指针来优化暴力枚举的一种算法。 该算法主要有四个步骤 1. 先进进窗口 2. 判断条件&#xff0c;后续根据条件来判断是出窗口还是进窗口 3. 出窗口 4.更新结果&#xff0c;更新结果这个步骤是不确定的&#xff0c…...

基于Java的世界时区自动计算及时间生成方法

目录 前言 一、zoneinfo简介 1、zoneinfo是什么 2、zoneinfo有什么 二、在Java中进行时区转换 1、Java与zoneInfo 2、Java展示zoneInfo实例 3、Java获取时区ID 三、Java通过经纬度获取时区 1、通过经度求解偏移 2、通过偏移量计算时间 3、统一的处理算法 四、总结 …...

Excel + Notepad + CMD 命令行批量修改文件名

注意&#xff1a;该方式为直接修改原文件的文件名&#xff0c;不会生成新文件 新建Excel文件 A列&#xff1a;固定为 renB列&#xff1a;原文件名称C列&#xff1a;修改后保存的名称B列、C列&#xff0c;需要带文件后缀&#xff0c;为txt文件就是.txt结尾&#xff0c;为png图片…...

OpenGL 几何着色器高级应用

几何着色器高级应用 概念回顾 几何着色器(Geometry Shader)是 OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心功能是基于输入的图元(如点、线或三角形),生成新的图元,或对输入的图元进行修改。 几何着色器的执行是以图元…...

【Unity基础】Unity 2D实现拖拽功能的10种方法

方法1. 基于 Update 循环的拖拽方法 (DragDrop2D) 代码概述 using System.Collections; using System.Collections.Generic; using UnityEngine;public class DragDrop2D : MonoBehaviour {bool isDraggable;bool isDragging;Collider2D objectCollider;void Start(){objectC…...

duxapp中兼容多端的 BoxShadow 阴影组件

由于RN 安卓端对阴影的支持不太完善&#xff0c;使用这个组件可以实现阴影效果 在RN端是使用 react-native-fast-shadow 实现的 示例 import { BoxShadow, Text } from /duxui<BoxShadow><Text>这是内容</Text> </BoxShadow>Props 继承自Taro的View…...

服务器---centos上安装docker并使用docker配置jenkins

要在 Docker 中安装 Jenkins 并进行管理,可以按照以下步骤操作: 1. 安装 Docker 首先,确保你的系统已经安装了 Docker。如果尚未安装,可以使用以下命令进行安装: 在 CentOS 上安装 Docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://…...

Linux系统操作03|chmod、vim

上文&#xff1a; Linux系统操作02|基本命令-CSDN博客 目录 六、chmod&#xff1a;给文件设置权限 1、字母法 2、数字法&#xff08;用的最多&#xff09; 七、vim&#xff1a;代码编写和文本编辑 1、启动和退出 1️⃣启动 2️⃣退出 2、vim基本操作 六、chmod&#x…...

数据库同步中间件DBSyncer安装配置及使用

1、介绍 DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务&#xf…...

虚幻5描边轮廓材质

很多游戏内都有这种描边效果&#xff0c;挺实用也挺好看的&#xff0c;简单复刻一下 效果演示&#xff1a; Linethickness可以控制轮廓线条的粗细 这样连完&#xff0c;然后放到网格体细节的覆层材质上即可 可以自己更改粗细大小和颜色...

ISP帳戶會記錄什麼資訊?

許多用戶並不知道ISP會記錄有關線上活動的大量資訊。從流覽歷史記錄到數據使用情況&#xff0c;ISP經常收集和保留用戶數據&#xff0c;引發一系列隱私問題。 ISP 記錄哪些數據&#xff1f; ISP可以根據其隱私政策記錄各種類型的資訊。常見的記錄數據包括&#xff1a; 1.流覽…...

Facebook如何避免因IP变动而封号?实用指南

随着Facebook在个人社交与商业推广中的广泛应用&#xff0c;越来越多的用户面临因“IP变动”而被封号的问题。尤其是跨境电商、广告运营者和多账号管理用户&#xff0c;这种情况可能严重影响正常使用和业务发展。那么&#xff0c;如何避免因IP变动导致的封号问题&#xff1f;本…...

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值&#xff1a; 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析&#xff0c;中国&#xff0c;李宗璋用EXCEL学统计学&#xff0c;日EXCEL统计分析与决策&#x…...

web网页连接MQTT,显示数据与下发控制命令

web网页连接MQTT&#xff0c;显示数据与下发控制命令 零、前言 在完成一些设备作品后&#xff0c;常常会因为没有一个上位机用来实时检测数据和下发命令而苦恼&#xff0c;在上一篇文章中提到了怎么白嫖阿里云服务器&#xff0c;并且在上面搭建了属于自己的web网站。那么现在…...

数据结构day3作业

一、完整功能【顺序表】的创建 【seqList.h】 #ifndef __SEQLIST_H__ #define __SEQLIST_H__#include <stdio.h> #include <string.h> #include <stdlib.h>//宏定义&#xff0c;线性表的最大容量 #define MAX 30//类型重定义&#xff0c;表示要存放数据的类…...

Android SDK 平台工具版本说明

Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具&#xff0c;主要是 adb 和 fastboot。虽然 adb 是 Android 应用开发所必需的&#xff0c;但应用开发者通常仅使用 Studio 安装的副本。如果您想直接从命令行使用 adb 并且未安装 S…...

Sharding-jdbc基本使用步骤以及执行原理剖析

一、基本使用步骤 1、需求说明 使用sharding-jdbc完成对订单表的水平分表&#xff0c;通过快速入门的开发&#xff0c;了解sharding-jdbc使用方法 人工创建两张表&#xff0c;t_order_1和t_order_2&#xff0c;这两张表是订单表拆分后的表&#xff0c;通过sharding-jdbc向订…...

mysql重置root密码(适用于5.7和8.0)

今天出一期重置mysql root密码的教程&#xff0c;适用于5.7和8.0&#xff0c;在网上搜索了很多的教程发现都没有效果&#xff0c;浪费了很多时间&#xff0c;尝试了多次之后发现这种方式是最稳妥的&#xff0c;那么废话不多说&#xff0c;往下看&#xff1a; 目录 第一步&…...

Linux下SVN客户端保存账号密码

参考文章&#xff1a;解决&#xff1a;Linux上SVN 1.12版本以上无法直接存储明文密码_linux svn 保存密码-CSDN博客新版本svn使用gpg-agent存储密码-CSDN博客svn之无法让 SVN 存储密码&#xff0c;即使配置设置为允许_编程设计_ITGUEST 方法一&#xff1a;明文方式保存密码 首…...

centos7.9 gcc升级到11.2.1

一、信息查看 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) Copyright © 2015 Free Software Foundation, Inc. 本程序是自由软件&#xff1b;请参看源代码的版权声明。本软件没有任…...

网站应该怎么做运维/太原网站快速排名提升

美国时间 1 月 18 日&#xff0c;据外媒 BleepingComputer 报道&#xff0c;欧洲非营利组织 NOYB 就商业隐私问题&#xff0c;代表10个用户向奥地利数据保护局提交了10份 GDPR 投诉&#xff0c;指控 8 家在线流媒体公司违反了 GDPR 第15条“访问权”。 这些公司包括亚马逊、苹…...

北京免费网站制作/seo引擎搜索网站关键词

首先解释一下&#xff0c;我在做自己android发育。java web这是我的弱点&#xff0c;就在最近&#xff0c;京东云免费&#xff0c;因此&#xff0c;要折腾几。有一点经验&#xff0c;特别是作为共享。假设内容的文章是错&#xff0c;还请高手指正。 我在这里web结束&#xff0c…...

电商网站前端开发/如何做市场调研和分析

项目需求&#xff1a; 在现有系统的基础上&#xff0c;实现网站的中英文切换&#xff0c;要求现有代码基本保持不变。 解决方案&#xff1a; 在经过众多的方案筛选后&#xff0c;选出了一个比较合适的方案。方案如下。 首先要实现网站的中英文切换总共分为两部分。 第一部分是…...

北京海淀区疫情最新消息/独立站seo推广

设计模式 – 策略模式Spring Bean代替if/else 策略模式 一、什么是策略模式 策略模式属于对象的行为模式。其用意是针对一组算法&#xff0c;将每一个算法封装到具有共同接口的独立的类中&#xff0c;从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下…...

做视频网站需要/手机游戏性能优化软件

使用 pip 包管理工具下载第三方包时&#xff0c;如果出现以下错误&#xff1a; 将报错路径下的对应包文件删除&#xff1a; 然后重新 pip install 安装即可&#xff1a;...

企业网站空间多大合适/百度查询入口

首先介绍几个相关概念。 临界资源&#xff1a;在同一时刻&#xff0c;只能被一个进程/线程所使用的资源。 临界区&#xff1a;访问临界资源的代码段。因此同一时刻只能有一个进程/线程进入临 界区。 进入区&#xff1a;进入临界区之前的代码段&#xff0c;一般用来做加锁操作。…...