2.2 类型转换与 printf 函数深度解析

news2024/9/22 15:48:33

1 类型转换

1.1 隐式类型转换

1.2 显式类型转换

1.3 应用:整除除法

2 printf 函数

2.1 语法格式

2.2 格式说明符

2.2.1 浮点数的规范性输出

2.2.2 格式说明符不匹配错误

2.3 修饰符

2.3.1 对齐方式

2.3.2 宽度

2.3.3 精度

2.3.4 填充字符

2.3.5 其他修饰符(# +)

3 练习


1 类型转换

1.1 隐式类型转换

隐式类型转换(又称自动类型转换)发生在不同数据类型的值进行运算时,编译器会自动将较低类型的数据转换为较高类型的数据,以保证运算的顺利进行。转换的规则主要基于数据类型的“大小”和“符号性”。一般来说,转换的优先级如下(从低到高):

  1. char 和 short 会被提升为 int(如果 int 能够表示它们的所有值)。
  2. 如果 int 不能表示 char 或 short 的所有值,则它们可能会被提升为 unsigned int
  3. 如果操作数中有 float 类型,则 int 和 unsigned int 会被转换为 float
  4. 如果操作数中有 double 类型,则 float 和 int 类型的操作数会被转换为 double
  5. 如果操作数中有 long double 类型,则其他类型的操作数会被转换为 long double

注意,char 类型是否被视为有符号还是无符号取决于编译器和具体的上下文(如是否使用了 signed 或 unsigned 关键字)。

下面是一个隐式类型转换的例子,这个例子中,intValue 是一个 int 类型的变量,而 floatValue 是一个 float 类型的变量。当它们被加在一起时,由于 float 类型比 int 类型具有更高的精度和范围,因此 intValue 会被隐式地转换为 float 类型,以便与 floatValue 进行加法运算。这种转换是自动的,不需要程序员显式地进行强制类型转换。

#include <stdio.h>

int main() {
    int intValue = 5;
    float floatValue = 3.14;

    // 在这里,intValue 会被隐式地转换为 float 类型,以与 floatValue 进行加法运算
    float result = intValue + floatValue;

    printf("Result of addition: %f\n", result);// 8.140000

    return 0;
}

1.2 显式类型转换

显式类型转换(又称强制类型转换)允许显式地将一个数据类型的值转换为另一个类型。这种转换是通过类型转换运算符来完成的,该运算符是一对圆括号,其中包含了目标类型的名称。例如,如果有一个 float 类型的变量,但想将它作为一个 int 类型来处理,可以这样做:

#include <stdio.h>

int main() {
    float f = 3.14;

    int i = (int)f; // 强制类型转换

    printf("%f\n",f);//3.140000
    printf("%d\n",i);//3

    return 0;
}

注意,强制类型转换可能会导致数据丢失。

1.3 应用:整除除法

在整数除法的场景中,如果两个操作数都是整数,那么结果也会是整数这意味着,小数部分会被自动截断。如果想看到小数部分,只需要将操作数之一转换为浮点数即可,如下所示:

#include <stdio.h>

int main() {

    int i = 5;
    float j = i / 2;  //由于 i 和 2 都是整数,所以这里的除法运算是整数除法。

    // 方法1:将整数变量 i 强制转换为浮点数 (float) i
    float k = (float) i / 2; //强制转换,将整数 i 转换为浮点数

    // 方法2:将除数 2 明确指定为浮点数 2.0 改变除法运算的性质
    // i 被隐式地转换为浮点数(通常是 double,因为 2.0 是 double 类型的)
    // 除法运算的结果是 double 类型的,因此在将结果赋值给 m 时,会发生从 double 到 float 的隐式类型转换
    float m = i / 2.0;  //2.0 是一个浮点数字面量

    printf("%f\n", j);  // 2.000000
    printf("%f\n", k);  // 2.500000
    printf("%f\n", m);  // 2.500000
    
    return 0;
}

2 printf 函数

2.1 语法格式

printf 函数可以输出各种类型的数据,包括整型、浮点型、字符型、字符串型等,实际原理是 printf 函数将这些类型的数据格式化为字符串后,放入标准输出缓冲区,然后将结果显示到屏幕上。

语法如下:

#include <stdio.h>
int printf(const char *format, ...);
  • printf 函数根据 format 给出的格式打印输出到 stdout (标准输出)和其他参数中。
  • format 是一个字符串,包含了要输出的文本以及一系列格式化说明符(如 %d、%f、%s 等),这些说明符指定了后续参数如何被格式化并插入到输出字符串中。
  • ... 表示printf函数可以接受可变数量的额外参数,这些参数与format字符串中的格式化说明符一一对应。

2.2 格式说明符

格式化说明符描述示例输出(假设变量值)
%d 或 %i十进制整数int a = 10; -> 10
%u无符号整数unsigned int b = 20; -> 20
%f浮点数(默认为双精度)

float c = 3.14; -> 3.140000 

double d = 3.14; -> 3.140000

%lf双精度浮点数double e = 3.14159; -> 3.141590
%s字符串char* f = "Hello"; -> Hello
%c字符char g = 'A'; -> A
%x 或 %X十六进制整数(小写/大写)int h = 255; -> ff 或 FF
%o八进制整数int i = 10; -> 12
%%百分号本身无直接变量对应,直接输出 %
%n到目前为止写入的字符数(不直接输出,而是存储在变量中)通常与指针一起使用,示例略
%p指针地址int* j = &a; -> 类似 0x7ffeefbff6f8 的地址

示例代码:

#include <stdio.h>

int main() {
    int a = 10;
    unsigned int b = 20;
    float c = 3.14;
    double d = 3.14159;
    char *f = "Hello";
    char g = 'A';
    int h = 255;
    int i = 10;

    printf("Decimal integer: %d\n", a);//Decimal integer: 10
    printf("Decimal integer: %i\n", a);//Decimal integer: 10
    printf("Unsigned integer: %u\n", b);//Unsigned integer: 20
    printf("Float: %f\n", c);//Float: 3.140000
    // 推荐在printf中对double类型使用 %f
    printf("Double: %f\n", d);//Double: 3.141590
    // 没必要在printf中对double类型使用 %lf
    printf("Double: %lf\n", d);//Double: 3.141590

    printf("String: %s\n", f);//String: Hello
    printf("Hello %s ,My name is %s\n", "everybody","Thanks");//Hello everybody ,My name is Thanks

    printf("Character: %c\n", g);//Character: A

    // 以其他进制数输出 int 定义的十进制数
    printf("Hexadecimal (lower): %x\n", h);//Hexadecimal (lower): ff
    printf("Hexadecimal (upper): %X\n", h);//Hexadecimal (upper): FF
    printf("Octal: %o\n", i);//Octal: 12

    printf("Percent sign: %%\n");//Percent sign: %

    // 指针地址的示例
    int *j = &a;
    printf("Pointer address: %p\n", j);//Pointer address: 000000000061FDEC
    //建议将指针转换为 (void*) 类型再用 %p 打印
    printf("Pointer address: %p\n", (void *) j); // Pointer address: 000000000061FDEC

    return 0;
}

2.2.1 浮点数的规范性输出

 见下面这段代码:

#include <stdio.h>

int main() {
    float f = 3.14f;
    double d = 3.141592653589793;

    printf("Float: %f\n", f);  // 推荐
    printf("Double: %f\n", d); // 推荐

    printf("Float: %lf\n", f); // 不推荐,应该避免这种做法
    printf("Double: %lf\n", d);// 没必要,%f就行


    return 0;
}

结果如下:

在C语言中,当涉及到可变参数列表(如 printf 和 scanf 函数的参数)时,存在类型提升(type promotion)的规则。具体来说,对于 float 类型的参数,在传递给这些函数时,它们会被自动提升为 double 类型。这就是为什么在 printf 中使用 %f 可以正确地输出 float 类型的变量,因为 %f 格式说明符预期的是一个 double 类型的参数(尽管在实际使用中,由于历史原因和兼容性考虑,%f 也被用于 float 类型的输出)。

总结一下:

  1. printf 中,对于 float 使用 %f,对于 double 也通常使用 %f(尽管技术上 %lf 可能在某些编译器上被接受,但这不是标准行为)。
  2. scanf 中,对于 float 使用 %f,对于 double 必须使用 %lf
#include <stdio.h>  
  
int main() {  
    float f = 0.0f;  
    double d = 0.0;  
  
    // 正确的 printf 使用  
    printf("Float with %f: %f\n", f, f);  
    printf("Double with %f (correct): %f\n", d, d);  
  
    // 注意:虽然下面这行在大多数编译器上可能工作,但它不是标准行为  
    // printf("Double with %lf (non-standard in printf): %lf\n", d, d); // 非标准,不建议使用  
  
    // 错误的 printf 使用(在技术上不是错误,但可能导致混淆)  
    // 这里没有直接的“错误”,但使用 %lf 在 printf 中可能会引起误解  
  
    // 正确的 scanf 使用  
    printf("Enter a float: ");  
    scanf("%f", &f);  
    printf("You entered: %f\n", f);  
  
    printf("Enter a double: ");  
    scanf("%lf", &d); // 必须使用 %lf 来读取 double  
    printf("You entered: %lf\n", d);  
  
    // 错误的 scanf 使用  
    // 下面这行代码是错误的,因为它试图用 %f 来读取 double 类型的变量  
    // printf("Incorrect scanf for double: ");  
    // scanf("%f", &d); // 错误:应该使用 %lf  
  
    return 0;  
}

关于 scanf 函数后续再进行讲解。

2.2.2 格式说明符不匹配错误

在C语言中,如果 printf 函数的格式说明符与提供的参数类型不匹配,那么可能会导致未定义行为(Undefined Behavior, UB)。这通常意味着程序可能会以不可预测的方式运行,包括但不限于输出垃圾值、程序崩溃或更隐蔽的错误。常见的类型不匹配情况如下:

1. 整数与浮点数混用:

  • 使用 %d 来打印 float 或 double 类型的变量。
  • 使用 %f 来打印 int 或 long 类型的变量。
#include <stdio.h>  
  
int main() {  
    float f = 3.14f;  
    double d = 3.14159;  
    int i = 42;  
    long l = 123456789L;  
  
    // 整数与浮点数混用  
    printf("Float as integer: %d\n", f);  // 未定义行为,可能输出垃圾值  
    printf("Double as integer: %d\n", d); // 同样,未定义行为  
    printf("Integer as float: %f\n", i);  // 正确输出整数对应的浮点数  
    printf("Long as float: %f\n", l);     // 正确输出长整数对应的浮点数,但注意精度可能丢失  
  
    // 正确的做法  
    printf("Float: %f\n", f);  
    printf("Double: %lf\n", d);  
    printf("Integer: %d\n", i);  
    printf("Long: %ld\n", l);  
  
    return 0;  
}

输出结果:

2. 指针与整数混用:

  • 使用 %d 来打印指针(应该使用 %p,并且指针值需要转换为 void* 类型)。
#include <stdio.h>

int main() {
    int var = 10;
    int *ptr = &var;

    // 指针与整数混用
    printf("错误:Pointer as integer: %d\n", ptr);  // 未定义行为,但通常打印指针的数值表示
    // 正确的做法
    printf("正确:Pointer: %p\n", (void*)ptr);  // 使用%p并转换为void*

    return 0;
}

输出结果:

3.字符与整数混用:

  • 使用 %s 来打印 char 类型的变量(应该使用 %c)。
  • 使用 %d 来打印 char 类型的变量时,虽然通常可以工作(因为 char 通常被提升为 int ),但这不是最佳实践。
#include <stdio.h>

int main() {
    char c = 'A';

    // 字符与整数混用
    printf("错误:Char as string: %s\n", &c);  // 未定义行为,因为%s期望一个字符串(以null结尾的字符数组)
    printf("ASCII码:Char as integer: %d\n", c);  // 通常可以工作,因为char被提升为int
    printf("字符:Char as char: %c\n", c);     // 正确的做法

    return 0;
}

输出结果:

 4.宽度/精度指示符的误用:

  • 格式说明符中的宽度/精度指示符与变量类型不匹配时,可能不会导致编译错误,但可能会产生不符合预期的输出。
#include <stdio.h>

int main() {
    int i = 123;
    float f = 123.456f;

    // 宽度/精度指示符的误用
    // 不会产生编译错误,但.2被忽略
    printf("Integer with precision: %.2d\n", i);
    // 正确,但宽度可能超出需要
    printf("Float with too much width: %20.2f\n", f);

    // 注意:%lf在printf中不是标准用法,但某些编译器可能接受
    printf("Float with invalid precision: %.2lf\n", f);

    // 正确的做法(对于float,使用%f)
    printf("Float with valid precision: %.2f\n", f);

    return 0;
}

输出结果:

2.3 修饰符

printf 函数的修饰符是格式化字符串中用于进一步控制输出格式的部分。它们可以指定输出的对齐方式、宽度、精度以及是否包含特定的前缀等。

2.3.1 对齐方式

  • 左对齐:在宽度指定前加上-(减号),表示输出将左对齐右边用空格填充。例如,%-5d
  • 默认(右对齐):如果不指定对齐方式,则默认为右对齐

2.3.2 宽度

  • 固定宽度:通过在 % 和格式字符之间指定一个整数来设置最小字段宽度。如果要输出的字符数少于这个宽度,则默认情况下会在左边(对于右对齐)或右边(对于左对齐)填充空格以达到指定的宽度。例如,%5d 表示输出一个整数,至少占用 5 个字符的宽度,不足部分用空格填充。如果要输出的字符数大于这个宽度不会截断它或在其左侧填充空格,直接原样输出,因为字符本身的长度已经超过了指定的宽度。
  • 动态宽度:使用 作为宽度的值,表示宽度将由格式化字符串中的下一个参数指定。例如,%*d,其中*对应的宽度值将在d之前的参数中给出
#include <stdio.h>

int main() {
    int num1 = 123;
    int num2 = 4567;

    // 固定宽度(右对齐)
    // 注意,这是最小字段宽度
    printf("%1d\n", num1);//原样输出:123
    printf("%2d\n", num1);//原样输出:123

    printf("%5d\n", num1);//默认为右对齐,左边填充两个空格。
    printf("%5d\n", num2);//默认为右对齐,左边填充一个空格。

    // 固定宽度(左对齐)
    printf("%-5d\n", num1);//为左对齐,右边填充两个空格。
    printf("%-5d\n", num2);//为左对齐,右边填充一个空格。

    // 动态宽度
    int width = 8;
    printf("%*d\n", width, num1);//为右对齐,左边填充5个空格。
    printf("%*d\n", width, num2);//为右对齐,左边填充4个空格。

    return 0;
}

输出结果:

2.3.3 精度

  • 对于浮点数:通过在.后指定一个整数来设置小数点后的位数。例如,%.2f 表示输出浮点数时保留两位小数。如果省略了精度,则默认为六位小数
  • 对于字符串:精度表示要输出的最大字符数。如果字符串的长度大于指定的精度,则会被截断。即使你指定了一个比字符串实际长度还要大的精度值,printf 也不会在字符串末尾添加任何字符或空格来填充到指定的长度。它只会打印出字符串中直到遇到结尾的 '\0' 或达到指定的最大字符数为止的部分
  • 动态精度:与动态宽度类似,使用 作为精度的值,表示精度将由格式化字符串中的下一个参数指定。
#include <stdio.h>

int main() {
    double num = 3.1415926;
    char str[] = "Hello World!";

    // 浮点数精度
    printf("%f\n", num);  // 输出 3.141593,默认6位,四舍五入
    //最小长度为4,小数点后两位
    printf("%4.2f\n", num);  // 输出 3.14
    printf("%.5f\n", num);  // 输出 3.14159

    // 字符串精度
    printf("%.5s\n", str);  // 输出 Hello
    //只会打印出字符串中直到遇到结尾的 '\0' 或达到指定的最大字符数为止的部分。
    printf("%.20s\n", str);  // 输出 Hello World!

    // 动态精度
    int precision1 = 3;
    int precision2 = 7;
    printf("%.*f\n", precision1, num);  // 输出 3.142
    printf("%.*f\n", precision2, num);  // 输出 3.141592

    printf("%.*s\n", precision1, str);  // 输出 Hel
    printf("%.*s\n", precision2, str);  // 输出 Hello W

    return 0;
}

2.3.4 填充字符

  • 默认情况下,如果输出值的字符数少于指定的宽度,则使用空格进行填充。但是,可以通过在宽度指定前加上 0 来指定使用零作为填充字符。例如,%05d 表示输出一个整数,至少占用5个字符的宽度,不足部分用零填充。
#include <stdio.h>

int main() {
    int num1 = 12;
    int num2 = 1234;

    printf("%05d\n", num1);  // 输出 00012
    printf("%05d\n", num2);  // 输出 01234

    return 0;
}

2.3.5 其他修饰符(# +)

  • #:对于八进制和十六进制整数,# 修饰符会在输出中包含前缀(0对于八进制,0x或0X对于十六进制)。例如,%#o、%#x、%#X
  • +:对于整数,+ 修饰符会强制在输出中包含正号或负号,即使数值是正数
#include <stdio.h>

int main() {
    int octal = 0123; // 八进制数
    int hex = 0xabc;  // 十六进制数
    int positive = 123;
    int negative = -123;

    // 使用 # 修饰符
    printf("Octal with #: %#o\n", octal); // 输出:Octal with #: 0123
    printf("Hex with #: %#x\n", hex);     // 输出:Hex with #: 0xabc
    printf("Hex with upper case #: %#X\n", hex); // 输出:Hex with upper case #: 0XABC

    // 使用 + 修饰符
    printf("Positive with +: %+d\n", positive); // 输出:Positive with +: +123
    printf("Negative with +: %+d\n", negative); // 输出:Negative with +: -123

    // 示例:使用字段宽度和对齐控制  
    printf("|%-10d|\n", positive); // 左对齐,宽度为10,不足部分用空格填充
    printf("|%+10d|\n", positive); // 右对齐(默认),宽度为10,正数前加空格以与负号对齐(但这里+修饰符不影响对齐)
    printf("|%-10d|\n", negative); // 左对齐,负数直接显示

    return 0;
}

输出结果:

下面通过一个例子来展示对齐的魅力:

#include <stdio.h>

int main() {
    // 假设我们有一些学生的姓名和分数
    char *names[] = {"Alice", "Bob", "Charlie", "David"};
    int scores[] = {90, 85, 95, 78};

    // 设置打印的列宽
    int nameWidth = 10; // 假设所有名字都不会超过10个字符宽(包括空格和制表符)
    int scoreWidth = 5; // 分数列宽度设置为5,足够显示两位数字和可能的空格

    // 打印表头
    printf("%-*s | %*s\n", nameWidth, "Name", scoreWidth, "Score");
    printf("%-*s | %*s\n", nameWidth, "------", scoreWidth, "-----");

    // 遍历数组并打印每个学生的姓名和分数
    for (int i = 0; i < 4; i++) {
        // 使用%-*s进行左对齐的字符串,%*d进行右对齐的整数
        printf("%-*s | %*d\n", nameWidth, names[i], scoreWidth, scores[i]);
    }

    return 0;
}

输出结果:


3 练习

1、int i = 5; float f = i / 2; 那么f 的值为2.5
A 正确            B 错误
答案: B
解释: 因为 i 是整型,所以除2是整除,得到的值是2,如果要得到2.5,应是(float)i/2。


2、printf 的 format 参数中含有%c代表要输出字符,%d 代表整型,%f代表浮点, %s 代表字符串
A 正确            B 错误
答案: A
解释: printf 的输出格式需要记住,这样在在线评测(OJ)中才能熟练应对,包括对于机试是很重要的。


3、printf的输出默认是左对齐
A 正确            B 错误
答案: B
解释: printf 的输出默认是右对齐,不是左对齐。如果需要左对齐,那么加入负号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【硬件调试】示波器探头一碰芯片引脚板子就短路或者闪小火花

问题: 今天拿示波器探头准备测量芯片引脚输出波形,有的引脚正常输出信号,有的会打小火花,但输出波形正常,还有一个引脚最离谱,示波器一碰,板子就立马短路,电流达到最大值,电源电压都被拉下来了,直到示波器探头拿开,板子才自动恢复,此时这个引脚测得波形如下: 根…

C++的链接指示extern “C“

目录 链接指示extern "C"A.What&#xff08;概念&#xff09;B.Why&#xff08;extern "C"的作用&#xff09;C.How &#xff08;如何使用链接指示extern "C"&#xff09; 链接指示extern “C” A.What&#xff08;概念&#xff09; extern&quo…

100 个网络基础知识普及,看完成半个网络高手!

1&#xff09;什么是链接&#xff1f; 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2&#xff09;OSI 参考模型的层次是什么&#xff1f; 有 7 个 OSI 层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0…

ElasticSearch第一天

学习目标&#xff1a; 能够理解ElasticSearch的作用能够安装ElasticSearch服务能够理解ElasticSearch的相关概念能够使用Postman发送Restful请求操作ElasticSearch能够理解分词器的作用能够使用ElasticSearch集成IK分词器能够完成es集群搭建 第一章 ElasticSearch简介 1.1 什么…

javaweb个人主页设计(html+css+js)

目录 1 前言和要求 1.1 前言 1.2 设计要求 2 预览 2.1 主页页面 2.2 个人简介 2.3 个人爱好 2.4 个人成绩有代码&#xff0c;但是图片已省略&#xff0c;可以根据自己情况添加 2.5 收藏夹 3 代码实现 3.1 主页 3.2 个人简介 3.3 个人爱好 3.4 个人成绩&#xff…

shell 字符串列表操作

我的需求是这样的&#xff1a;编译多个模块的时候&#xff0c;把失败的模块添加到列表里&#xff0c;最后输出。这个列表类似这样&#xff1a;failModuleList"a b c d e" 先定义一个空的字符串列表&#xff1a; failModuleList"" 然后利用字符串的拼接方…

CVPR`24 | 又快又好!渲染速度比ENeRF快30倍!4K4D:实时4K分辨率4D视图合成

文章链接&#xff1a;https://arxiv.org/pdf/2310.11448 git链接&#xff1a; https://zju3dv.github.io/4k4d/ 本文旨在实现动态3D场景在4K分辨率下的高保真和实时视图合成。最近&#xff0c;一些动态视图合成方法在渲染质量方面表现出色。然而&#xff0c;在渲染高分辨率图像…

如何合并pdf文件?分享3种常见的方法!

在数字化办公日益普及的今天&#xff0c;PDF文件因其格式稳定、兼容性强、阅读方便等特点&#xff0c;成为了人们日常工作和学习中不可或缺的一部分。然而&#xff0c;当我们需要处理多个PDF文件时&#xff0c;如何将它们高效地合并成一个文件&#xff0c;以便更好地管理和分享…

Linux进程——进程的概念

文章目录 PCB进程排队进程标识符pid终止进程获取进程id父进程与子进程 我们在上一节内容中有简单谈到进程的感性理解&#xff0c;他在课本上的概念是&#xff0c;程序的一个执行实例或正在执行的程序 但在本质上&#xff0c;他其实就是一个被分配了系统资源&#xff08;CPU&am…

公有云API常见的认证方式

公有云API常见的认证方式 Token认证 &#xff08;百度云、腾讯云&#xff09; AK/SK认证 (阿里云、天翼云、腾讯云) RSA非对称加密方式 &#xff08;信核云灾备&#xff09; Token认证 AK/SK认证 RSA认证 种方式使用一对密钥&#xff0c;即公钥和私钥。公钥可以公开&#x…

Java数据结构-链表与LinkedList

链表 链表的概念 链表是一种物理存储结构上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 通俗来说&#xff0c;相比较于顺序表&#xff08;物理上连续&#xff0c;逻辑上也连续&#xff09;&#xff0c;链表物理上不一定连续。 链表是…

【C++航海王:追寻罗杰的编程之路】一篇文章带你认识哈希

目录 1 -> unordered系列关联式容器 1.1 -> unordered_map 1.1.1 -> unordered_map的文档介绍 1.1.2 -> unordered_map的接口说明 1.2 -> unordered_set 2 -> 底层结构 2.1 -> 哈希概念 2.2 -> 哈希冲突 2.3 -> 哈希函数 2.4 -> 哈希冲…

Mysql进阶(一)——存储引擎

MySQL体系结构 1). 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念&#xff0c;为通过认证安全接入的…

【启明智显分享】ESP32-S3 4.3寸触摸串口屏HMI应用方案:WIFI/蓝牙无线通信助力烘干设备实现远程遥控

技术不断进步&#xff0c;人们对烘干设备的美观度、功能多样性提出更高要求&#xff0c;传统的数码管显示、按键式控制已经无法满足客户的需求。用智能屏替代传统的数码管可以很好的解决这个问题&#xff0c;为用户带来更好的人机交互体验。 基于此&#xff0c;启明智显提出将乐…

在Nginx里给你的站点或者目录加个用户认证

在HTTP中&#xff0c;基本认证&#xff08;Basic access authentication&#xff09;是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。 常见的用户认证截图 ngx_http_auth_basic_module模块实现让访问着&#xff0c;只有…

免费分享:2018-2023中国地区地震数据集(附下载方法)

地震波是地震引起的振动以波的形式从震源向各个方向传播并释放的能量。震级是表示地震本身大小的尺度&#xff0c;地震烈度是指某一地区的地面和各类建筑物遭受到一次地震影响的强烈程度。 数据简介 2018-2023中国地区地震数据集主要变量包括time&#xff08;时间&#xff09…

爬虫管理解决方案:让数据收集变得高效且合规

一、为何数据收集的效率与合规性同等重要&#xff1f; 随着大数据技术的飞速发展&#xff0c;数据收集已成为企业决策与市场洞察的核心驱动力。然而&#xff0c;在信息海洋中精准捕捞的同时&#xff0c;如何确保这一过程既高效又不触碰法律的红线&#xff0c;是每个数据实践者…

程序员标准简历模板

链接: https://pan.baidu.com/s/1yMXGSSNba15b9hMXjA39aA?pwdb4ev 提取码: b4ev 3年工作经验简历 链接: https://pan.baidu.com/s/1OO7n1lRL6AkhejxYC9IyDA?pwdfmvv 提取码: fmvv 优秀学员简历 链接: https://pan.baidu.com/s/106Vkw_ulOInI47_5mDySSg?pwduudc 提取码: uu

红酒的未来展望:探索行业的发展趋势

在时间的洪流中&#xff0c;红酒以其不同的魅力&#xff0c;一直占据着人们心中不可或缺的地位。随着时代的变迁&#xff0c;红酒行业也在不断地发展和演变。今天&#xff0c;就让我们一起走进红酒的未来&#xff0c;探索这个古老而又充满活力的行业将如何继续书写其辉煌的篇章…

使用node-cmd重启electron

说明&#xff1a;在electron中&#xff0c;想要手动重启客户端服务&#xff0c;分为两种情况 第一种&#xff1a;是使用electron自带的api进行窗口的重新启动&#xff0c;app.relaunch() 第二种&#xff1a;重启电脑运行的客户端服务 安装 npm install node-cmd -S使用 使用说…