【单片机 C语言】单片机学习过程中常见C库函数(学习笔记)
memset()
C 标准库 - <string.h>
string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
<string.h> 是 C 标准库中的一个头文件,提供了一组用于处理字符串和内存块的函数。这些函数涵盖了字符串复制、连接、比较、搜索和内存操作等。
描述
void *memset(void *str, int c, size_t n)
| 参数 | 说明 |
| *str | 指向要填充的内存区域的指针,使用时需要确保 ptr 指向的内存区域足够大,避免发生越界访问 |
| c | 要设置的值,通常是一个无符号字符,通常是一个 int 类型的值,但实际上只使用了该值的低8位。这意味着在范围 0 到 255 之外的其他值可能会产生未定义的行为 |
| n | 要被设置为该值的字节数,通常是通过 sizeof() 或其他手段计算得到的 |
sizeof()
sizeof() 函数是一个运算符而不是函数,用于计算一个类型或变量所占用的内存字节数。可以用它来获取任何类型的数据的字节数,包括基本数据类型、数组、结构体、共用体等等。
语法形式
sizeof 运算符有两种使用形式:
- 计算数据类型的大小:
sizeof(数据类型) - 计算变量的大小:
sizeof(变量名)或者sizeof 变量名
sizeof(int) // 输出 4,即整型变量占用 4 个字节
int x;
sizeof(x) // 输出 4,即整型变量 x 占用 4 个字节char s[] = "Hello, world!";
sizeof(s) // 输出 14,即字符串 s 中有 14 个字符(包括结尾的空字符 '\0')
memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零'\0' 或设置为特定值。
实例1
#include <stdio.h>
#include <string.h>int main()
{char buffer[100];// 将buffer数组的所有元素初始化为 '\0'memset(buffer, '\0', sizeof(buffer));return 0;
}
实例2
#include <stdio.h> //包含标准输入输出库的头文件,以便使用puts函数进行输出操作
#include <string.h> //包含字符串处理函数的头文件,这里使用的strcpy和memset函数都声明在这个头文件中int main ()
{// 定义一个大小为50的字符数组char str[50];// 使用strcpy函数将字符串复制到str数组中strcpy(str,"This is string.h library function");// 使用puts函数输出字符串puts(str);// 使用memset函数将str数组的前7个字符设置为'$'memset(str,'$',7);// 再次使用puts函数输出修改后的字符串puts(str);return(0);
}
打印结果
This is string.h library function
$$$$$$$ string.h library function
在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。
#include <stdio.h>
#include <string.h> int main()
{char buffer[10];// 将 buffer 数组的前5个字节设置为字符 'A',并添加字符串终止符memset(buffer, 'A', 5);buffer[5] = '\0'; // 确保添加字符串终止符printf("Buffer after memset: %s\n", buffer);// 将 buffer 数组清零,使用 '\0' 替代 0memset(buffer, '\0', sizeof(buffer)); // 使用'\0'确保一致性及可读性printf("Buffer after memset: %s\n", buffer);return 0;
}
打印结果
Buffer after memset: AAAAA
Buffer after memset:
注意事项
- 字符串结束标志:使用
%s输出字符串时,函数会从指定的字符串起始地址开始输出字符,直到遇到字符串结束标志'\0'才会停止。所以,确保字符串以'\0'结尾是很重要的,不然可能会输出多余的字符。 - 参数匹配:在使用
%s时,对应的参数必须是一个指向以'\0'结尾的字符数组(也就是字符串)的指针。如果参数类型不匹配,可能会导致未定义行为。
strlen()
C 标准库 - <string.h>
描述
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
size_t 是 C 和 C++ 编程语言里的一种数据类型,主要用于表示对象的大小或者数组的长度。
const 是一个类型修饰符,其主要作用是把变量或者对象声明为常量,以此来保证它们的值在程序运行期间不会被修改。
size_t strlen(const char *str)
| 参数 | 说明 |
| *str | 要计算长度的字符串 |
返回值:该函数返回字符串的长度。
实例
#include <stdio.h>
#include <string.h>int main ()
{// 定义一个大小为 50 的字符数组 str,用于存储字符串char str[50];// 定义一个整型变量 len,用于存储字符串的长度int len;// 使用 strcpy 函数将字符串 "This is runoob.com" 复制到字符数组 str 中// strcpy 函数的原型是 char *strcpy(char *dest, const char *src);// 它会把 src 指向的字符串复制到 dest 指向的数组中,并且会复制字符串结束标志 '\0'strcpy(str, "This is runoob.com");// 使用 strlen 函数计算字符数组 str 中字符串的长度// strlen 函数的原型是 size_t strlen(const char *s);// 它会从 s 指向的字符开始,逐个字符计数,直到遇到字符串结束标志 '\0' 为止// 注意,strlen 计算的长度不包括字符串结束标志 '\0'len = strlen(str);// 使用 printf 函数输出字符串及其长度// %s 是格式说明符,用于输出字符串// %d 是格式说明符,用于输出十进制整数printf("|%s| 的长度是 |%d|\n", str, len);// main 函数返回 0,表示程序正常结束return(0);
}
打印结果
|This is runoob.com| 的长度是 |18|
sizeof() 和 strlen()区别:C 语言关于sizeof() 和 strlen()区别 | 菜鸟教程
strstr()
C 标准库 - <string.h>
描述
C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 \0。
char *strstr(const char *haystack, const char *needle);
| 参数 | 说明 |
| *haystack | 要被搜索的主字符串,即较大的字符串,通常是一个以 '\0' 结尾的字符数组。该参数被声明为 const char *,表示函数不会修改这个字符串的内容 |
| *needle | 要查找的子字符串,同样是一个以 '\0' 结尾的字符数组 |
strstr() 函数用于在字符串 haystack 中查找子字符串 needle 的第一次出现位置。如果找到,则返回指向该位置的指针;如果未找到,则返回 NULL。
返回值
- 如果在
haystack中找到了needle子字符串,函数返回一个指向needle在haystack中首次出现位置的指针。 - 如果
needle是空字符串,则返回haystack本身。 - 如果在
haystack中没有找到needle子字符串,则返回NULL。
实例
#include <stdio.h>
#include <string.h>int main() {// 定义一个指向常量字符的指针 haystack,// 并初始化为一个包含多个字符的字符串,作为被搜索的主字符串const char *haystack = "Hello, World! This is a test.";// 定义一个指向常量字符的指针 needle,// 并初始化为一个较短的字符串,作为要在主字符串中查找的子字符串const char *needle = "World";// 调用 strstr 函数,该函数用于在 haystack 中查找 needle 首次出现的位置// 若找到,返回指向该位置的指针;若未找到,返回 NULL// 将函数返回结果存储在指针变量 result 中char *result = strstr(haystack, needle);// 判断 result 是否不为 NULL,即是否找到了子字符串if (result != NULL) {// 如果找到了子字符串,使用 printf 函数输出信息// 输出子字符串及其在主字符串中首次出现位置开始的后续内容printf("子字符串 '%s' 在主字符串中首次出现的位置是: %s\n", needle, result);} else {// 如果未找到子字符串,使用 printf 函数输出提示信息printf("未找到子字符串 '%s'\n", needle);}// main 函数返回 0,表示程序正常结束return 0;
}
打印结果
子字符串 'World' 在主字符串中首次出现的位置是: World! This is a test.
strcat()
C 标准库 - <string.h>
描述
strcat() 是 C 语言标准库 <string.h> 中的一个函数,其作用是将一个字符串追加到另一个字符串的末尾
char *strcat(char *dest, const char *src);
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
| 参数 | 说明 |
| *dest | 目标字符串,也就是要被追加内容的字符串。它必须是一个足够大的字符数组,以容纳原字符串和要追加的字符串以及字符串结束符 '\0' |
| *src | 源字符串,即要追加到目标字符串末尾的字符串,该字符串不会覆盖目标字符串 |
返回值:函数返回一个指向目标字符串 dest 的指针,方便进行链式调用。
实例
#include <stdio.h>
#include <string.h>int main() {char dest[50] = "Hello, ";const char *src = "World!";// 调用 strcat 函数将 src 追加到 dest 的末尾strcat(dest, src);printf("拼接后的字符串是: %s\n", dest);return 0;
}
工作原理
strcat() 函数会先找到目标字符串 dest 的末尾(即 '\0' 字符的位置),然后将源字符串 src 的内容复制到该位置,包括 src 的字符串结束符 '\0'。
注意事项
- 目标数组大小:使用
strcat()时,必须确保目标数组dest有足够的空间来容纳源字符串src。如果dest数组空间不足,会导致缓冲区溢出,这是一个严重的安全问题。 - 字符串结束符:目标字符串
dest必须以'\0'结尾,否则strcat()函数可能无法正确找到字符串的末尾,从而导致未定义行为。
strcpy()
C 标准库 - <string.h>
描述
strcpy() 是 C 语言标准库 <string.h> 中的一个函数,用于将一个字符串复制到另一个字符数组中
char *strcpy(char *dest, const char *src);
作用:把 src 所指向的字符串复制到 dest。
| 参数 | 说明 |
| *dest | 指向用于存储复制内容的目标数组,也就是要将字符串复制到的地方。它必须有足够的空间来容纳源字符串(包含字符串结束符 '\0') |
| *src | 要复制的字符串,是一个以 '\0' 结尾的字符序列,函数会将其内容复制到目标数组中 |
返回值:函数返回一个指向目标字符数组 dest的指针,这样设计方便进行链式调用。
实例
#include <stdio.h>
#include <string.h>int main() {char dest[20];const char *src = "Hello, World!";// 调用 strcpy 函数将 src 复制到 deststrcpy(dest, src);printf("复制后的字符串是: %s\n", dest);return 0;
}
工作原理
strcpy() 函数会从源字符串 src 的起始位置开始,逐个字符地将字符复制到目标数组 dest 中,直到遇到源字符串的结束符 '\0'。复制完成后,结束符 '\0' 也会被复制到目标数组中,以此确保目标数组存储的是一个合法的字符串。
注意事项
- 目标数组大小:使用
strcpy()时,要保证目标数组dest有足够的空间来存储源字符串及其结束符。如果dest数组空间不足,会引发缓冲区溢出问题,这是一种严重的安全隐患。 - 覆盖原有内容:
strcpy()会覆盖目标数组dest中原有的内容。如果dest之前已经存储了数据,复制操作会将其覆盖。
puts()
C 标准库 - <stdio.h>
puts() 是 C 语言标准库 <stdio.h> 中的一个函数,主要用于将字符串输出到标准输出设备(通常是控制台),并在输出结束后自动添加一个换行符
int puts(const char *s);
s:指向要输出的字符串的指针,该字符串必须以空字符 '\0' 结尾 。
返回值
- 如果输出成功,
puts()函数返回一个非负整数(通常是一个表示成功输出的正数)。 - 如果输出过程中发生错误,函数返回
EOF(通常定义为 -1),EOF是<stdio.h>中定义的一个宏,用于表示文件结束或输入输出错误。
实例
#include <stdio.h>int main()
{const char *message = "Hello, World!";int result = puts(message);if (result == EOF) {printf("输出过程中发生错误。\n");} else {printf("字符串输出成功。\n");}return 0;
}
工作原理
puts() 函数会从指针 s 所指向的位置开始,逐个字符地输出字符串,直到遇到字符串结束符 '\0' 为止。在输出完字符串后,它会自动在末尾添加一个换行符 '\n',这意味着每次调用 puts() 后,下一次的输出会从新的一行开始。
与 printf() 的比较
- 功能差异:
puts()主要用于输出字符串并自动添加换行符,功能相对单一;而printf()是一个格式化输出函数,可以根据格式说明符输出不同类型的数据,功能更加灵活和强大。 - 使用场景:如果只需要输出一个字符串并换行,使用
puts()会更简洁;如果需要对输出进行格式化,例如输出不同类型的数据、控制输出的宽度和精度等,则应该使用printf()。
atoi()
C 标准库 - <stdlib.h>
描述
int atoi(const char *nptr);
作用:把参数 nptr 所指向的字符串转换为一个整数(类型为 int 型)。
nptr:这是一个指向要转换的字符串的指针。该字符串可以包含可选的前导空白字符(如空格、制表符等),接着可以是一个可选的正负号(+或-),然后是一系列的数字字符。函数会尝试将这样的字符串转换为对应的整数值。
返回值
- 若字符串能够成功转换为整数,
atoi()函数会返回转换后的整数值。 - 若字符串不能被正确转换,比如字符串中不包含有效的数字字符,函数会返回 0。
实例1
#include <stdio.h>
#include <stdlib.h>int main() {const char *str1 = "12345";const char *str2 = " -678";const char *str3 = "abc123";int num1 = atoi(str1);int num2 = atoi(str2);int num3 = atoi(str3);printf("字符串 '%s' 转换后的整数是: %d\n", str1, num1);printf("字符串 '%s' 转换后的整数是: %d\n", str2, num2);printf("字符串 '%s' 转换后的整数是: %d\n", str3, num3);return 0;
}
打印结果
字符串 '12345' 转换后的整数是: 12345
字符串 ' -678' 转换后的整数是: -678
字符串 'abc123' 转换后的整数是: 0
注意事项
- 溢出问题:
atoi()函数不会对转换结果进行溢出检查。如果字符串表示的数值超出了int类型的取值范围,会产生未定义行为。 - 错误处理:
atoi()函数在遇到无法转换的字符串时只会返回 0,无法明确区分是字符串表示的数值为 0 还是转换失败。
printf()函数
C 标准库 - <stdio.h>
C 库函数 – printf() | 菜鸟教程
printf()规定符
- %d 十进制有符号整数
- %u 十进制无符号整数
- %f 浮点数
- %s 字符串
- %c 单个字符
- %p 指针的值
- %e 指数形式的浮点数
- %x, %X 无符号以十六进制表示的整数
- %o 无符号以八进制表示的整数
- %g 把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
- %p 输出地址符
- %lu 32位无符号整数
- %llu 64位无符号整数
- %% 输出百分号字符本身。
上述部分笔记来自C库函数-菜鸟教程
相关文章:
【单片机 C语言】单片机学习过程中常见C库函数(学习笔记)
memset() C 标准库 - <string.h> string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。 <string.h> 是 C 标准库中的一个头文件,提供了一组用于处理字符串和内存块的函数。这些函数涵盖了字符串复制、连接、比较、搜索和内存操作…...
神经网络优化 - 小批量梯度下降之批量大小的选择
上一博文学习了小批量梯度下降在神经网络优化中的应用: 神经网络优化 - 小批量梯度下降-CSDN博客 在小批量梯度下降法中,批量大小(Batch Size)对网络优化的影响也非常大,本文我们来学习如何选择小批量梯度下降的批量大小。 一、批量大小的…...
Novartis诺华制药社招入职综合能力测评真题SHL题库考什么?
一、综合能力测试 诺华制药的入职测评中,综合能力测试是重要的一部分,主要考察应聘者的问题解决能力、数值计算能力和逻辑推理能力。测试总时长为46分钟,实际作答时间为36分钟,共24题。题型丰富多样,包括图形变换题、分…...
文件的物理结构和逻辑结构的区分
文件的物理结构和逻辑结构是文件系统中两个重要的概念,它们分别描述了文件在存储设备上的实际存储方式以及用户在编程或操作文件时所看到的抽象组织形式。理解这两者的区别和联系对于深入掌握文件系统的设计和实现至关重要。 一、文件的逻辑结构 定义 文件的逻…...
C语言学习记录(16)文件操作7
前面学的东西感觉都跟写代码有关系,怎么突然就开始说文件了,有什么用呢? 其实,文件是另一种数据存储的方式,学会使用文件就可以让我们的数据持久的保存。 一、文件是什么 就算没有学过相关的知识,在这么…...
Coze平台 创建AI智能体的详细步骤指南
一、创建智能体的基础流程 注册与登录 访问Coze官网(www.coze.cn),使用邮箱或手机号注册账号并登录。 创建智能体 在控制台点击左侧“”按钮,选择“创建智能体”,输入名称(如“职场鼓励师”&…...
《作用域大冒险:从闭包到内存泄漏的终极探索》
“爱自有天意,天有道自不会让有情人分离” 大家好,关于闭包问题其实实际上是js作用域的问题,那么js有几种作用域呢? 作用域类型关键字/场景作用域范围示例全局作用域var(无声明)整个程序var x 10;函数作用…...
android Stagefright框架
作为Android音视频开发人员,学习Stagefright框架需要结合理论、源码分析和实践验证。以下是系统化的学习路径: 1. 基础准备 熟悉Android多媒体体系 掌握MediaPlayer、MediaCodec、MediaExtractor等核心API的用法。 理解Android的OpenMAX IL(…...
Shell脚本-变量的分类
在Shell脚本编程中,变量是存储数据的基本单位。它们可以用来保存字符串、数字甚至是命令的输出结果。正确地定义和使用变量能够极大地提高脚本的灵活性与可维护性。本文将详细介绍Shell脚本中变量的不同分类及其应用场景,帮助你编写更高效、简洁的Shell脚…...
<C#>.NET WebAPI 的 FromBody ,FromForm ,FromServices等详细解释
在 .NET 8 Web API 中,[FromBody]、[FromForm]、[FromHeader]、[FromKeyedServices]、[FromQuery]、[FromRoute] 和 [FromServices] 这些都是用于绑定控制器动作方法参数的特性,下面为你详细解释这些特性。 1. [FromBody] 作用:从 HTTP 请求…...
让数据应用更简单:Streamlit与Gradio的比较与联系
在数据科学与机器学习的快速发展中,如何快速构建可视化应用成为了许多工程师和数据科学家的一个重要需求。Streamlit和Gradio是两款备受欢迎的开源库,它们各自提供了便捷的方式来构建基于Web的应用。虽然二者在功能上有许多相似之处,但它们的…...
LlamaIndex 生成的本地索引文件和文件夹详解
LlamaIndex 生成的本地索引文件和文件夹详解 LlamaIndex 在生成本地索引时会创建一个 storage 文件夹,并在其中生成多个 JSON 文件。以下是每个文件的详细解释: 1. storage 文件夹结构 1.1 docstore.json 功能:存储文档内容及其相关信息。…...
AndroidRom定制删除Settings某些菜单选项
AndroidRom定制删除Settings某些菜单选项 1.前言. 最近在Rom开发中需要隐藏设置中的某些菜单,launcher3中的定制开发,这个属于很基本的定制需求,和隐藏google搜素栏一样简单,这里我就不展开了,直接上代码. 2.隐藏网络…...
Mysql相关知识2:Mysql隔离级别、MVCC、锁
文章目录 MySQL的隔离级别可重复读的实现原理Mysql锁按锁的粒度分类按锁的使用方式分类按锁的状态分类 MySQL的隔离级别 在 MySQL 中,隔离级别定义了事务之间相互隔离的程度,用于控制一个事务对数据的修改在何时以及如何被其他事务可见。MySQL 支持四种…...
Python爬虫实战:获取海口最近2周天气数据,为出行做参考
一、引言 天气状况对人们的出行计划影响重大。获取准确的天气信息并进行分析,能助力用户更好地规划出行。天气网虽提供丰富的天气数据,但因网站存在反爬机制,直接获取数据存在一定难度。本研究借助 Python 的 Scrapy 框架,结合多种技术手段,实现对海口最近两周天气数据的…...
并发设计模式之双缓冲系统
双缓冲的本质是 通过空间换时间,通过冗余的缓冲区解决生产者和消费者的速度差异问题,同时提升系统的并发性和稳定性。 双缓冲的核心优势 优势具体表现解耦生产与消费生产者和消费者可以独立工作,无需直接同步。提高并发性生产者和消…...
linux sysfs的使用
在Linux内核驱动开发中,device_create_file 和 device_remove_file 用于动态创建/删除设备的 sysfs 属性文件,常用于暴露设备信息或控制参数。以下是完整示例及详细说明: 1. 头文件引入 #include <linux/module.h> #include <linux/…...
【数据结构和算法】3. 排序算法
本文根据 数据结构和算法入门 视频记录 文章目录 1. 排序算法2. 插入排序 Insertion Sort2.1 概念2.2 具体步骤2.3 Java 实现2.4 复杂度分析 3. 快排 QuickSort3.1 概念3.2 具体步骤3.3 Java实现3.4 复杂度分析 4. 归并排序 MergeSort4.1 概念4.2 递归具体步骤4.3 Java实现4.4…...
LintCode第192题-通配符匹配
描述 给定一个字符串 s 和一个字符模式 p ,实现一个支持 ? 和 * 的通配符匹配。匹配规则如下: ? 可以匹配任何单个字符。* 可以匹配任意字符串(包括空字符串)。 两个串完全匹配才算匹配成功。 样例 样例1 输入: "aa&q…...
redis常用的五种数据类型
redis常用的五种数据类型 文档 redis单机安装redis数据类型-位图bitmap 说明 官网操作命令指南页面:https://redis.io/docs/latest/commands/?nameget&groupstring 常用命令 keys *:查看所有键exists k1 k2:键存在个数type k1&…...
Linux 进程与线程间通信方式及应用分析
Linux 进程与线程间通信方式及应用分析 文章目录 Linux 进程与线程间通信方式及应用分析 1. 管道(Pipe)1.1 匿名管道(Anonymous Pipe)示例代码:结果: 1.2 命名管道(FIFO)示例代码&am…...
AI日报 - 2024年04月22日
🌟 今日概览(60秒速览) ▎🤖 模型进展 | Google发布Gemini 2.5 Flash,强调低延迟与成本效益;Kling AI 2.0展示多轴运动视频生成;研究揭示SLM在知识图谱上优于LLM,RLHF在推理提升上存局限。 ▎💼…...
FreeRTos学习记录--2.内存管理
后续的章节涉及这些内核对象:task、queue、semaphores和event group等。为了让FreeRTOS更容易使用,这些内核对象一般都是动态分配:用到时分配,不使用时释放。使用内存的动态管理功能,简化了程序设计:不再需…...
HAL库(STM32CubeMX)——高级ADC学习、HRTIM(STM32G474RBT6)
系列文章目录 文章目录 系列文章目录前言存在的问题HRTIMcubemx配置前言 对cubemx的ADC的设置进行补充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选 ADC_Se…...
单例模式(线程安全)
1.什么是单例模式 单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单…...
FreeRTos学习记录--1.工程创建与源码概述
1.工程创建与源码概述 1.1 工程创建 使用STM32CubeMX,可以手工添加任务、队列、信号量、互斥锁、定时器等等。但是本课程不想严重依赖STM32CubeMX,所以不会使用STM32CubeMX来添加这些对象,而是手写代码来使用这些对象。 使用STM32CubeMX时&…...
基于大模型的血栓性外痔全流程风险预测与治疗管理研究报告
目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、血栓性外痔概述 2.1 定义与发病机制 2.2 临床表现与诊断方法 2.3 现有治疗手段综述 三、大模型在血栓性外痔预测中的应用原理 3.1 大模型技术简介 3.2 模型构建与训练数据来源 3.3 模型预测血栓性外痔的工作流程…...
进程控制(linux+C/C++)
目录 进程创建 写时拷贝 fork 进程终止 退出码 进程退出三种情况对应退出信号 :退出码: 进程退出方法 进程等待 两种方式 阻塞等待和非阻塞等待 小知识 进程创建 1.在未创建子进程时,父进程页表对于数据权限为读写,对于…...
C++如何处理多线程环境下的异常?如何确保资源在异常情况下也能正确释放
多线程编程的基本概念与挑战 多线程编程的核心思想是将程序的执行划分为多个并行运行的线程,每个线程可以独立处理任务,从而充分利用多核处理器的性能优势。在C中,开发者可以通过std::thread创建线程,并使用同步原语如std::mutex、…...
TensorBoard如何在同一图表中绘制多个线条
1. 使用不同的日志目录 TensorBoard 会根据日志文件所在的目录来区分不同的运行。可以为每次运行指定一个独立的日志目录,TensorBoard 会自动将这些目录中的数据加载并显示为不同的运行。 示例(TensorFlow): import tensorflow…...
