《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》
目录
七. strncpy函数的使用与模拟实现
7.1 strncpy函数理解
7.2 strncpy函数使用示例
7.3 strncpy函数模拟实现
八. strncat函数的使用与模拟实现
8.1 strncat函数理解
8.2 strncat函数使用示例
8.3 strncat函数模拟实现
九. strncmp函数的使用
9.1 strncmp函数理解
9.2 strncmp函数使用示例
十. strstr函数的使用与模拟实现
10.1 strstr函数理解
10.2 strstr函数使用示例
10.3 strstr函数模拟实现
十一. strtok函数的使用与模拟实现
11.1 strtok函数理解
11.2 strtok函数使用示例
11.3 strtok注意事项
十二. strerror函数的使用与模拟实现
12.1 strerror函数理解
12.2 strerror函数使用
12.3 perror函数
七. strncpy函数的使用与模拟实现
7.1 strncpy函数理解
strncpy
是 C 标准库中用于复制字符串的函数,定义在 <string.h>
头文件中。相比 strcpy
,它提供了长度限制,可以防止缓冲区溢出。
函数原型
char *strncpy(char *dest, const char *src, size_t n);
参数说明
dest
: 目标字符数组,用于存储复制的内容
src
: 源字符串,将被复制的字符串
n
: 最多复制的字符数(包括 ‘\0’)返回值
返回目标字符串
dest
的指针功能特点
复制最多 n 个字符 从
src
到dest
两种终止条件:
遇到
src
的 ‘\0’ 终止符达到最大字符数 n
7.2 strncpy函数使用示例
#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = { 0 };char arr2[] = "hello,worldCCCCCCC";char* p = strncpy(arr1, arr2, 11);printf("%s\n", p);printf("%s\n", arr1);return 0;
}
7.3 strncpy函数模拟实现
#include<stdio.h> // 标准输入输出库
#include<string.h> // 字符串操作库
#include<assert.h> // 断言库// 自定义的strncpy函数
// 参数:arr1 - 目标字符串,arr2 - 源字符串,num - 要拷贝的字符数
// 返回值:指向目标字符串的指针
char* my_strncpy(char* arr1, const char* arr2, size_t num)
{// 使用断言确保目标指针和源指针都不为NULLassert(arr1 && arr2);// 保存目标字符串的起始地址,用于返回char* p = arr1;int i = 0;// 循环拷贝字符,直到达到指定数量或遇到源字符串的结束符for (i = 0; i < num && arr2[i]; i++){arr1[i] = arr2[i];}// 如果拷贝的字符数少于指定数量,则在目标字符串后添加结束符if (i < num){arr1[i] = 0;}// 返回目标字符串的起始地址return p;
}int main()
{char arr1[20] = { 0 }; // 初始化目标字符串数组,全部置为0char arr2[] = "abcdefg"; // 源字符串char* ret = my_strncpy(arr1, arr2, 5); // 调用自定义函数,拷贝前5个字符printf("%s", ret); // 输出结果:abcdereturn 0;
}
八. strncat函数的使用与模拟实现
8.1strncat函数理解
strncat
是 C 标准库中的一个字符串拼接函数,用于将源字符串的前 n
个字符追加到目标字符串的末尾,并自动添加终止符 \0
。
函数原型:
char *strncat(char *dest, const char *src, size_t n);
dest
:目标字符串(必须足够大以容纳追加后的结果)。src
:源字符串(不会被修改)。n
:最多追加的字符数(如果src
长度小于n
,则只追加src
的全部内容)。- 返回值:返回
dest
的指针。
8.2 strncat函数使用示例
#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "hello";char arr2[] = "world";char*p=strncat(arr1, arr2,5);printf("%s\n", p);printf("%s\n", arr1);return 0;
}
8.3 strncat函数模拟实现
#include<stdio.h> // 标准输入输出库
#include<assert.h> // 断言库// 自定义的 strncat 函数
// 参数:arr1 - 目标字符串,arr2 - 源字符串,num - 要追加的字符数
// 返回值:指向目标字符串的指针
char* mystrncat(char* arr1, const char* arr2, size_t num)
{assert(arr1 && arr2); // 确保目标指针和源指针都不为 NULLchar* p = arr1; // 保存目标字符串的起始地址,用于返回// 找到目标字符串的末尾(即 '\0' 的位置)while (*arr1){arr1++;}// 从源字符串复制最多 num 个字符到目标字符串的末尾int i = 0;for (i = 0; arr2[i] && i < num; i++){arr1[i] = arr2[i];}// 如果 num 小于 0,则在目标字符串后添加结束符(但 num 是 size_t,不可能小于 0)if (num < 0){arr1[i] = 0;}return p; // 返回目标字符串的起始地址
}int main()
{char arr1[20] = "hello "; // 目标字符串char arr2[] = "worldCCCCC"; // 源字符串char* ret = mystrncat(arr1, arr2, 5); // 调用自定义函数,追加前 3 个字符printf("%s", ret); // 输出结果:helloworreturn 0;
}
九. strncmp函数的使用
9.1 strncmp函数理解
strncmp
是 C 标准库中的一个字符串比较函数,用于比较两个字符串的前 n
个字符。它的主要作用是判断两个字符串是否相等,或者在字典序(ASCII 码顺序)上的大小关系。
函数原型
int strncmp(const char *str1, const char *str2, size_t n);
str1
:第一个字符串(不会被修改)。str2
:第二个字符串(不会被修改)。n
:最多比较的字符数。- 返回值:
< 0
:str1
的前n
个字符在字典序上小于str2
。= 0
:str1
的前n
个字符与str2
完全相同。> 0
:str1
的前n
个字符在字典序上大于str2
。
strncmp
的工作原理:
- 逐个字符比较:
- 从
str1
和str2
的第一个字符开始比较,直到遇到不同的字符或比较完n
个字符。- 比较规则:
- 如果
str1
的字符 ASCII 码值 <str2
的字符,返回 负数。- 如果
str1
的字符 ASCII 码值 >str2
的字符,返回 正数。- 如果前
n
个字符完全相同,返回 0。- 提前终止条件:
- 遇到
\0
(字符串结束符)时停止比较。- 比较完
n
个字符时停止。
9.2 strncmp函数使用示例
#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abcggg";int ret = strncmp(arr1, arr2, 5);if (ret > 0)printf("abcdef>abcggg\n");else if (ret < 0)printf("abcdef<abcggg\n");elseprintf("=\n");return 0;
}
十. strstr函数的使用与模拟实现
10.1 strstr函数理解
strstr
是 C 标准库中的一个字符串查找函数,用于在一个字符串中查找另一个字符串的首次出现位置。
函数原型
char *strstr(const char *haystack, const char *needle);
- 参数:
haystack
:被搜索的主字符串needle
:要查找的子字符串- 返回值:
- 如果找到,返回指向主字符串中子字符串首次出现位置的指针
- 如果未找到,返回 NULL
功能说明:
strstr
函数会扫描haystack
字符串,查找needle
字符串的第一次出现。查找是区分大小写的。
10.2 strstr函数使用示例
#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "I LOVE CHAIN";char arr2[] = "LOVE";char* p = strstr(arr1, arr2);if (p != NULL)printf("查找成功: %s\n", p);elseprintf("抱歉 查找失败\n");
}
10.3 strstr函数模拟实现
#include<stdio.h> // 标准输入输出库
#include<string.h> // 字符串操作库
#include<assert.h> // 断言库// 自定义的 strstr 函数
// 参数:str1 - 被查找的字符串,str2 - 要查找的子串
// 返回值:如果找到,返回子串在 str1 中的起始地址;否则返回 NULL
char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2); // 确保 str1 和 str2 都不为 NULLchar* p = (char*)str1; // 用于遍历 str1char* s1 = NULL; // 用于临时记录 str1 的当前位置char* s2 = NULL; // 用于遍历 str2// 如果要查找的子串是空字符串,直接返回 str1if (*str2 == '\0')return (char*)str1;// 遍历 str1while (*p){s1 = p; // 记录当前查找的起始位置s2 = (char*)str2; // 每次从 str2 的开头开始匹配// 逐个字符比较,直到字符不匹配或任一字符串结束while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}// 如果 str2 已经遍历完(即找到完整匹配),返回起始位置 pif (*s2 == '\0')return p;p++; // 继续查找下一个位置}return NULL; // 遍历完 str1 仍未找到,返回 NULL
}int main()
{char arr1[] = "I LOVE CHINA"; // 被查找的字符串char arr2[] = "LOVE"; // 要查找的子串char* ret = my_strstr(arr1, arr2); // 调用自定义查找函数if (ret != NULL){printf("查找成功:%s", ret); // }else{printf("查找失败");}return 0;
}
十一. strtok函数的使用与模拟实现
11.1 strtok函数理解
strtok
是 C 标准库中的一个字符串分割函数,用于将一个字符串按照指定的分隔符(delimiters)拆分成多个子字符串(tokens)。
函数原型
#include <string.h> // 需要包含头文件char *strtok(char *str, const char *delimiters);
str
:待分割的字符串(首次调用时传入,后续调用传NULL
)。
delimiters
:分隔符集合(如", \t \n"
表示按空格、逗号、制表符、换行符分割)。返回值:
成功时返回下一个子字符串(token)的指针。
如果没有更多子字符串,返回
NULL
。
strtok
的工作原理
首次调用:
传入待分割的字符串
str
,strtok
找到第一个分隔符,将其替换为\0
,并返回第一个子字符串的指针。后续调用:
传入
NULL
,strtok
会从上次结束的位置继续查找下一个分隔符,并返回下一个子字符串。结束条件:
当所有子字符串都被提取后,返回
NULL
。
为什么后续调用传入NULL?
原因如下:
1.
strtok
的工作原理
strtok
是一个状态ful(stateful)函数,它会记住上一次处理的位置。具体来说:
首次调用时,
strtok
接收一个字符串(如str
)和分隔符(如delimiters
),它会从该字符串的起始位置开始扫描,找到第一个不包含分隔符的子字符串(token),并返回它。后续调用时,
strtok
需要继续从上次结束的位置开始扫描剩余的部分。为了告诉strtok
继续处理同一个字符串,需要传入NULL
作为第一个参数。如果传入一个新的字符串,strtok
会重置内部状态,开始处理新的字符串。2. 为什么传入
NULL
?
内部静态指针:
strtok
内部使用一个静态指针(或全局变量)来记录当前处理的位置。首次调用时,这个指针被初始化为传入字符串的地址;后续调用时,传入NULL
表示“继续处理上次的字符串”。避免重置状态:如果后续调用传入一个新的字符串(非
NULL
),strtok
会重置内部指针,导致之前的分割状态丢失。
11.2 strtok函数使用示例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>int main() {char str[] = "hello,world;this|is-a.test";const char* delimiters = ",;|-."; // 分隔符可以是逗号、分号、竖线、横线、点// 首次调用,传入 strchar* token = strtok(str, delimiters);while (token != NULL) {printf("Token: %s\n", token);token = strtok(NULL, delimiters); // 后续调用传 NULL}return 0;
}
11.3 strtok注意事项
修改原字符串:
strtok
会直接修改传入的字符串,将分隔符替换为\0
。因此,不能对常量字符串(如"hello,world"
)使用strtok
,否则会导致段错误(Segmentation Fault)。✅ 正确:
char str[] = "hello,world";
(可修改)❌ 错误:
char *str = "hello,world";
(字符串常量,不可修改)连续分隔符:
如果字符串中有连续的分隔符(如
"a,,b"
),strtok
会跳过它们,不会返回空字符串。不能嵌套调用:
- 由于
strtok
使用静态存储,不能同时用于多个字符串的分割。例如:char str1[] = "a,b"; char str2[] = "1;2"; char *token1 = strtok(str1, ","); // 第一次调用 char *token2 = strtok(str2, ";"); // 会破坏 str1 的分割状态!
十二. strerror函数的使用与模拟实现
12.1 strerror函数理解
strerror
是 C 标准库中的一个函数,用于将错误代码(errno
)转换为可读的错误信息字符串。它定义在 <string.h>
头文件中,通常与 errno
(定义在 <errno.h>
)一起使用,以便在程序出错时提供更友好的错误提示。
函数原型
#include <string.h> char *strerror(int errnum);
参数:
errnum
:错误代码(通常是errno
的值)。返回值:
返回一个指向错误描述字符串的指针(静态存储区,不可修改)。
strerror
的用途
在不同的系统和C语言标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用⼀个全局的变量 errno 来记录程序的当前错误码,只不过程序启动的时候errno是 0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在 errno 中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回
12.2 strerror函数使用
#include <errno.h>
#include <string.h>
#include <stdio.h>
//打印0~10这些错误码对应的信息
int main()
{int i = 0;for (i = 0; i <= 10; i++) {printf("%d.%s\n",i, strerror(i));}return 0;
}
示例
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//C语言可以打开文件//fopen//如果以读的形式打开文件,文件是必须要存在的,如果文件不存在,则打开文件失败//fopen函数就会将错误码放在errno//同时函数就会返回NULLFILE* pFile;pFile = fopen("5_20.text", "r");if (pFile == NULL)printf( %s\n", strerror(errno));return 0;
}
12.3 perror函数
perror
是 C 标准库(<stdio.h>
)中的一个函数,用于打印与 errno
相关的错误信息。它的原型如下:
void perror(const char *s);
功能
- 根据全局变量
errno
(通常由系统调用或库函数设置)打印对应的错误描述。- 如果
s
不是NULL
或空字符串,perror
会先输出s
,后跟一个冒号:
和空格,然后输出errno
对应的错误信息。- 如果
s
是NULL
或空字符串,则只输出errno
的错误信息。
使用示例
int main() {FILE* fp = fopen("nonexistent_file.txt", "r");if (fp == NULL) {perror("Failed to open file");}return 0;
}
与 strerror(errno)
的区别
perror
直接打印错误信息到stderr
(标准错误输出)。strerror(errno)
返回错误信息的字符串,可以自定义输出方式:
fprintf(stderr, "Error: %s\n", strerror(errno));
以上就是字符函数和字符串函数上篇的全部内容 希望能够为您提供帮助
往期回顾
《C 语言字符串操作从入门到实战(上篇):字符分类、转换及strlen/strcpy等函数详解》
相关文章:

《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》
目录 七. strncpy函数的使用与模拟实现 7.1 strncpy函数理解 7.2 strncpy函数使用示例 7.3 strncpy函数模拟实现 八. strncat函数的使用与模拟实现 8.1 strncat函数理解 8.2 strncat函数使用示例 8.3 strncat函数模拟实现 九. strncmp函数的使用 9.1 strncmp函数理…...

百度飞桨PaddleOCR 3.0开源发布 OCR精度跃升13%
百度飞桨 PaddleOCR 3.0 开源发布 2025 年 5 月 20 日,百度飞桨团队正式发布了 PaddleOCR 3.0 版本,并将其开源。这一新版本在文字识别精度、多语种支持、手写体识别以及高精度文档解析等方面取得了显著进展,进一步提升了 PaddleOCR 在 OCR …...

Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用
一、FPGA 在线升级 FPGA 在线升级FLASH时,一般是通过逻辑生成SPI接口操作FLASH,当然也可以通过其他SOC经FPGA操作FLASH,那么FPGA就要实现在启动后对FLASH的控制。 对于7Series FPGA,只有CCLK是专用引脚,SPI接口均为普…...

数字孪生驱动的离散制造智能升级:架构设计与工程实践
针对离散制造行业多品种、小批量的生产特性,本文提出一种基于数字孪生的智能制造解决方案。以某国家级智能制造试点示范项目为载体,构建"云-边-端"协同的数字孪生系统,实现设备综合效率(OEE)提升28.7%、订单…...

9.4在 VS Code 中配置 Maven
在 VS Code 中配置 Maven 需要完成 Maven 环境安装 一、安装 Maven(如果未安装) 下载 Maven 访问 Apache Maven 官网,下载最新版本的 Maven(如apache-maven-3.9.9-bin.zip)。 解压文件 将下载的 ZIP 文件解压到本地目…...
mmaction2——tools文件夹下
build_rawframes.py 用法示例 python tools/data/build_rawframes.py data/videos data/frames --task rgb --level 2 --ext mp4 --use-opencv --num-worker 8总结: 只需要 RGB 帧,推荐 --use-opencv,简单高效,无需额外依赖。 …...

新能源汽车充电桩资源如何利用资源高效配置?
新能源汽车充电桩资源的高效配置是实现绿色交通转型的关键环节。随着新能源汽车保有量的快速增长,充电基础设施的供需矛盾日益凸显。如何优化充电桩资源布局、提升使用效率、平衡不同场景需求,成为当前亟待解决的问题。以下是几点关于充电桩资源高效配置…...
python 程序实现了毫米波大规模MIMO系统中的信道估计对比实验
python 程序实现了毫米波大规模MIMO系统中的信道估计对比实验 import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.models import Sequential, Model from tensorflow.keras.layers...
NTFS0x90属性和0xa0属性和0xb0属性的一一对应关系是index_entry中的index_node中VCN和runlist和bitmap
第一部分: 0: kd> dt _FILE_RECORD_SEGMENT_HEADER 0xc1241400 Ntfs!_FILE_RECORD_SEGMENT_HEADER 0x000 MultiSectorHeader : _MULTI_SECTOR_HEADER 0x008 Lsn : _LARGE_INTEGER 0x80e74aa 0x010 SequenceNumber : 5 0x012 Referen…...
PDF 编辑批量拆分合并OCR 识别
各位办公小能手们!你们有没有过被PDF文件折磨得死去活来的经历?反正我是有,每次要编辑PDF,那叫一个费劲啊!不过呢,今天我要给大家介绍一款神器——WPS PDF to Word,有了它,PDF编辑那…...

LeetCode --- 450周赛
题目列表 3550. 数位和等于下标的最小下标 3551. 数位和排序需要的最小交换次数 3552. 网格传送门旅游 3553. 包含给定路径的最小带权子树 II 一、数位和等于下标的最小下标 直接模拟计算数位和即可,代码如下 // C class Solution { public:int smallestIndex(ve…...

SpringBoot中消息转换器的选择
SpringBoot返回xml-CSDN博客 是返回JSON 还是XML 是由内容协商机制确认的,SpringBoot为了开发便利性,如果我没有该消息转换器,默认就返回了JSON,如果需要XML那么,引入 <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>…...
(初级)前端初学者入门指南:HTML5与CSS3核心知识详解
对于前端初学者来说,掌握HTML5和CSS3的基础知识是构建现代化网页的第一步。本文将围绕语义化标签、多媒体嵌入、盒模型、Flexbox布局和Grid布局五大核心知识点展开,通过代码示例和详细解析帮助大家快速上手。 一、HTML5:从结构到交互的革新 …...

基于点标注的弱监督目标检测方法研究
摘要 在计算机视觉领域,目标检测需要大量精准标注数据,但人工标注成本高昂。弱监督目标检测通过低成本标注训练模型,成为近年研究热点。本文提出一种基于点标注的弱监督目标检测算法,仅需在图像中物体中心点标注,即可高…...
【RichTextEditor】 【分析2】RichTextEditor设置文字内容背景色
【RichTextEditor】 【分析2】RichTextEditor设置文字内容背景色 都说AI Coder的Cursor很牛,也付费用了, 但这个背景色,搞了一天也没改过来。 最后,让它分析该控件的层次结构及文本内容显示的位置。 然后,搞定&#…...

超越OpenAI CodeX的软件工程智能体:Jules
目前AI编码代理(coding agent)领域正迅速崛起,Google推出了一款名为Jules的非同步编码代理(asynchronous coding agent),主要针对专业开发者,与传统在开发环境中直接辅助编码的Cursor或Windsurf…...
Qt实战教程:设计并实现一个结构清晰、功能完整的桌面应用
概述 本文以文本编辑器项目作为示例,文本编辑器是一个非常适合新手入门的经典项目。它具备了桌面应用开发中的核心要素: 窗口管理菜单栏和工具栏文件操作(打开、保存)多文档支持(可选)国际化支持(多语言)插件系统(进阶扩展)通过这个项目,你将学习到如何使用Qt进行桌…...

轻量化MEC终端 特点
MEC(多接入边缘计算)解决方案通过将计算能力下沉至网络边缘,结合5G网络特性,已在多个行业实现低延迟、高可靠、高安全的应用部署。以下从技术架构、核心优势及典型场景三方面进行总结: 一、技术架构 分层设计 MEC架…...

NIST提出新型安全指标:识别潜在被利用漏洞
美国国家标准与技术研究院(NIST)近日公布了一项突破性的安全指标,旨在评估哪些软件漏洞可能已被利用——即使相关组织尚未察觉。 这项由前NIST专家Peter Mell和网络安全与基础设施安全局(CISA)Jonathan Spring共同完成…...

List介绍
什么是List 在集合框架中,List是一个接口,继承自Collection Collection也是一个接口,该接口中规范了后序容器中常用的一些方法 Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下࿱…...

正则表达式全解:一文学会正则表达式【附在线正则表达式练习网站】
1.正则表达式的作用 案例演示 先给大家看一个例子,在以下文本中存储了一些职位信息: Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员 测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员 Python3 …...

Nginx-详解(二)
nginx 常见模块 第三方模块是对nginx 的功能扩展,第三方模块需要在编译安装nginx 的时候使用参数-- add-modulePATH指定路径添加,有的模块是由公司的开发人员针对业务需求定制 开发的,有的模块是开源爱好者开发好之后上传到github进行开源的…...
解决 IntelliJ IDEA 配置文件中文被转义问题
在使用 IntelliJ IDEA 进行开发时,我们经常需要编辑各种配置文件(如 .properties、.xml、.json 等)。然而,许多开发者都遇到过这样的困扰:配置文件中的中文内容被自动转义成了 Unicode 编码,显示为类似 \u4…...

MCP、MCPHub、A2A、AG-UI概述
MCP Model Context Protocol,模型上下文协议,Anthropic于2024年开源的标准协议,旨在统一AI模型与数据源的交互方式,提升数据访问的便捷性和可靠性,提供标准化的工具调用、资源管理和提示词功能。 MCP的基本定义&…...
计算机视觉与深度学习 | Python实现CEEMDAN-ISOS-VMD-GRU-ARIMA时间序列预测(完整源码和数据)
以下是结合CEEMDAN、ISOS-VMD、GRU和ARIMA的时间序列预测的Python完整实现方案。本方案包含完整的代码、数据生成逻辑和实现细节说明。 完整代码实现 import numpy as np import pandas as pd from PyEMD import CEEMDAN from vmdpy import VMD from scipy.optimize import di…...

[Linux]磁盘分区及swap交换空间
linux磁盘分区 计算机容量单位:一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示。 它们之间的关系是: 1KB (Kilobyte 千字节)1024B, 1MB (Megabyte 兆…...
JAVA面向对象——对象和类的基本语法
JAVA面向对象——对象和类的基本语法 一、面向对象编程基础 1. 程序中的数据存储方式 基本类型:变量(如 int max 15;)。数据结构:数组(一维/二维)、对象(特殊数据结构,用于存储复…...

Linux常见指令合集+知识点
Linux有一条设计理念:Linux中一切皆文件;这样的设计理念让Linux可以用一种统一的方式对Linux中的不同文件/设备进行管理;(也就是键盘、显示器等在Linux中也算文件) 文件内容属性,指令一般都是对文件进行操…...

nginx 基于IP和用户的访问
nginx的下载 yum install nginx.x86_64 -y 启动服务 systemctl enable --now nginx.service 查看服务目录 [rootwebserver ~]# rpm -ql nginx /usr/bin/nginx-upgrade /usr/lib/systemd/system/nginx.service /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx…...

【Linux】系统程序−进度条
文章目录 一、准备知识1.回车与换行1.1 回车1.2 换行 2. 行缓冲区3. 倒计时程序 二、进度条程序1. 版本1 一、准备知识 在讲解进度条之前,先讲解几个概念 1.回车与换行 1.1 回车 回车:\r 作用:将光标移动到当前行的行首(水平回…...