【C语言】字符串和内存函数的介绍 -- 详解

news2025/1/19 20:31:16
重点介绍处理字符和字符串的库函数的使用和注意事项。
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。

一、求字符串长度⚪strlen 

  • 字符串以 '\0' 作为结束标志,strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数不包含 '\0' )
  • 参数指向的字符串必须要以 '\0' 结束。
  • 易错点):注意函数的返回值为 size_t,是无符号(unsigned)的。

strlen - C++ Reference (cplusplus.com)

⚪【模拟实现】(三种不同方法)

#include <stdio.h>

// 1、计数器方式
size_t my_strlen(const char* str)
{
	size_t count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

// 2、不能创建临时变量计数器
size_t my_strlen(const char* str) 
{ 
    if(*str == '\0')
    {
        return 0;
    }
    else 
    {
        return 1 + my_strlen(str+1);
    }
}

// 3、指针-指针的方式
size_t my_strlen(char* str) 
{
    char *p = str; 
    while(*p != '\0' ) 
    {
        p++;
    } 
    return p-str; 
}

int main()
{
	char arr[] = "hello world";
	size_t count = my_strlen(arr);
	printf("%zu\n", count);
	return 0;
}


二、长度不受限制的字符串函数

1、strcpy

Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).

  • 源字符串 src 必须'\0' 结束
  • 会将源字符串 src 中的 '\0' 拷贝到目标空间 dest。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变,即目标空间 dest 不可以被 const 声明

strcpy - C++ Reference (cplusplus.com)

⚪【模拟实现】

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* str2, const char* str1)
{
	assert(str1 && str2);
	char* ret = str2;
	while (*str2++ = *str1++)
	{
		;
	}
	return ret;
}

int main()
{
	char s1[] = "hello world";
	char s2[20] = { 0 };
	char* ret = my_strcpy(s2, s1);
	printf("%s\n", ret);
	return 0;
}


2、strcat

Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the fifirst character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
  • 源字符串 src 必须'\0' 结束
  • 将源字符串 src 中的 '\0' 一同拷贝到目标空间 dest ,并删除 *dest 原来末尾的 '\0'
  • 目标空间必须有足够大,能容纳下源字符串的内容。
  • 目标空间必须可修改,即目标空间 dest 不可以被 const 声明

strcat - C++ Reference (cplusplus.com)

🔺字符串自己给自己追加,会如何?

        当使用 strcat 函数将一个字符串追加到自身时,可能会导致未定义的行为。strcat 函数的工作原理是在源字符串的结尾处追加目标字符串的内容,并在结尾加上空字符 '\0'。当源字符串和目标字符串是同一个字符串时,追加操作会导致源字符串的内容被破坏,因为在追加过程中,源字符串的内容会被覆盖,最终结果会是一个不可预测的字符串。因为根据不同的编译器和库的版本,strcat 函数在某些情况下可能不会导致未定义行为。但是将一个字符串追加到自身仍然是一个不好的编程实践,因为它容易引发错误和混乱。

        因此,不推荐使用 strcat 函数将字符串追加到自身。如果需要将一个字符串复制到另一个字符串末尾,可以使用 strcpy 函数进行复制操作。

【模拟实现】

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
	char* tmp = dest;
	assert(dest && src);
	while (*dest)
	{
		dest++;
	}
	while (*dest = *src)
	{
		dest++;
		src++;
	}
	return tmp;
}

int main()
{
	char s1[20] = "hello";
	char s2[] = " world";
	char* ret = my_strcat(s1, s2);
	printf("%s\n", ret);
	return 0;
}


3、strcmp

This function starts comparing the fifirst character of each string. If they are equal to each other, it continues with the following pairs until the characters diffffer or until a terminating null-character is reached.

标准规定
  • 第一个字符串大于第二个字符串,则返回大于 的数字
  • 第一个字符串等于第二个字符串,则返回 0
  • 第一个字符串小于第二个字符串,则返回小于 的数字

strcmp - C++ Reference (cplusplus.com)

🔺那么如何判断两个字符串?

        返回值只需要满足要求即可,比如大于 0 的数字,不一定是1,只需满足条件即可。

strcmp 函数的比较是基于字符的 ASCII 码进行的。它从两个字符串的第一个字符开始逐个比较,直至找到不相等的字符或者其中一个字符串的结束符 '\0'。在比较的时候,它会将两个字符的 ASCII 码进行减法运算,返回结果作为比较的结果。

        需要注意的是,strcmp 函数是区分大小写的。也就是说,大写字母和小写字母被认为是不同的字符。如果需要不区分大小写的字符串比较,可以使用 strcasecmp 函数(在某些编程环境中可能被称为_stricmp)。

⚪【模拟实现】

#include <stdio.h>
#include <assert.h>

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return (*str1 - *str2);
}

int main()
{
	char s1[] = "abcdef";
	char s2[] = "abcq";
	int ret = my_strcmp(s1, s2);
	if (ret > 0)
	{
		printf(">\n");
	}
	else if (ret == 0)
	{
		printf("=\n");
	}
	else
	{
		printf("<\n");
	}
	return 0;
}

⚠ 注意:根据编译器的不同,返回的结果也不同。

VS2019 中,大于返回 1,等于返回 0,小于返回 -1。但在 Linux-gcc 中,大于返回正数,等于返回0,小于返回负数。

// 推荐
if(strcmp(p1, p2) > 0)
{
    printf("p1 > p2");
}
else if(strcmp(p1, p2 == 0))
{
    printf("p1 == p2");
}
else if(strcmp(p1, p2) < -1)
{
    printf("p1 < p2");
}

// 不推荐
if(strcmp(p1, p2) == 1)
{
    printf("p1 > p2");
}
else if(strcmp(p1, p2 == 0))
{
    printf("p1 == p2");
} else if(strcmp(p1, p2) == -1)
{
    printf("p1 < p2");
}

三、长度受限制的字符串函数介绍

1、strncpy

Copies the fifirst num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
  • 拷贝 count 个字符从源字符串到目标空间。
  • 如果源字符串的长度小于 count,则拷贝完源字符串之后,在目标的后边追加 0直到 count 
  • dest 和 src 不应该重叠(重叠时可以用更安全的 memmove 替代)。

  • 目标空间 dest 必须足够大,以确保能够存放源字符串。

  • 目标空间 dest 必须可变,即目标空间 dest 不可以被 const 声明

strncpy - C++ Reference (cplusplus.com)

⚪【模拟实现】

#include <stdio.h>
#include <assert.h>

char* my_strncpy(char* dest, const char* src, size_t count)
{
	assert(dest && src);
	char* cur = dest;
	while (count--)
	{
		if ((*dest++ = *src++) == '\0')
		{
			break;
		}
	}

	if (count != 0)
	{
		while (count--)
		{
			*dest++ = '\0';
		}
	}
	return cur;
}

int main()
{
	char s1[20] = { 0 };
	char s2[] = "hello world";
	int sz = sizeof(s2) / sizeof(s2[0]);
	printf("%s\n", my_strncpy(s1, s2, sz));
	return 0;
}


2、strncat

Appends the fifirst num characters of source to destination, plus a terminating null-character. If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.
  • 如果源字符串的长度小于 count,则只复制 '\0' 之前的内容。
strncat - C++ Reference (cplusplus.com)

⚪【模拟实现】

#include <stdio.h>
#include <assert.h>

char* my_strncat(char* dest, const char* src, size_t count)
{
    assert(dest && src);
    char* cur = dest;
    while (*dest)
    {
        dest++;
    }

    while (count--)
    {
        if ((*dest++ = *src++) == '\0')
        {
            return cur;
        }
    }
    *dest = '\0';
    return cur;
}

int main()
{
    char s1[20] = "hello";
    char s2[] = " world";
    size_t sz = sizeof(s2) / sizeof(s2[0]);
    printf("%s\n", my_strncat(s1, s2, sz)); // 从s2中取sz个追加到s1中
	return 0;
}


3、strncmp

  • 比较到出现另个字符不一样或者一个字符串结束或者 count 个字符全部比较完。

strncmp - C++ Reference (cplusplus.com)

【代码演示】 

#include <stdio.h>
#include <string.h>
 
int main()
{
    const char* p1 = "abczdef";
    const char* p2 = "abcqwer";
    int ret1 = strncmp(p1, p2, 1);
    int ret2 = strncmp(p1, p2, 4);
    printf("%d %d\n", ret1, ret2);
 
    return 0;
}


四、字符串查找

1、strstr


Returns a pointer to the fifirst occurrence of str2 in str1, or a null pointer if str2 is not part of str1.
  • 返回字符串中首次出现子串的地址。若 str2 是 str1 的子串,则返回 str2 在 str1 中首次出现的地址。如果 str2 不是 str1 的子串,则返回 NULL 。
strstr - C++ Reference (cplusplus.com)

⚪【模拟实现】

#include <stdio.h>
#include <assert.h>

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')
	{
		return (char*)str1;
	}
	char* cur = (char*)str1;
	char* s1, *s2;
	while (*cur != '\0')
	{
		s1 = cur;
		s2 = (char*)str2;

		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;
}

int main()
{
	char s1[] = "abbcde";
	char s2[] = "bcd";
	char s3[] = "abcd";
	char* ret1 = my_strstr(s1, s2);
	char* ret2 = my_strstr(s1, s3);
	if (ret1 == NULL)
	{
		printf("未找到匹配的子串!\n");
	}
	else
	{
		printf("%s\n", ret1);
	}
	if (ret2 == NULL)
	{
		printf("未找到匹配的子串!\n");
	}
	else
	{
		printf("%s\n", ret2);
	}
	return 0;
}


2、strtok

  • sep(delimit) 参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了 个或者多个由 sep 字符串中一个或者多个分隔符分割的标记。
  • strtok 函数找到 str 中的下一个标记,并将其用 '\0' 结尾,返回一个指向这个标记的指针。(注:strtok 函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok 函数的第一个参数不为 NULL ,函数将找到 str 中第一个标记,strtok 函数将保存它在字符串中的位置。
  • strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

strtok - C++ Reference (cplusplus.com)

注意strtok 会破坏原字符串,分割后原字符串保留第一个分割符前的字符。 

【代码演示】

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[] = "3031899646@qq.com";
    printf("原字符串: %s\n", arr);

    const char* sep = "@."; // 创建sep
    char arr1[30];
    char* ret = NULL;
    strcpy(arr1, arr); // 将数据拷贝一份,保留arr数组的内容

    // 分行打印切割内容
    for (ret = strtok(arr, sep); ret != NULL; ret = strtok(NULL, sep))
    {
        printf("%s\n", ret);
    }

    printf("分割后原字符串被破坏: %s\n", arr); // 分割后原字符串保留第一个分割符前的字符
    return 0;
}


五、错误信息报告⚪strerror

  • 返回错误码,所对应的错误信息。
  • errno 是一个全局的错误码变量。当 C 语言的库函数在执行过程中,发生了错误后就会把对应的错误码赋值到errno中。

strerror - C++ Reference (cplusplus.com)

⚪【模拟实现】 

#include <stdio.h>
#include <string.h>
#include <errno.h>

// 错误码   错误信息
// 0 -      No error
// 1 -      Operation not permitted
// 2 -      No such file or directory
//

int main()
{
    char* str = strerror(errno);
    printf("%s\n", str);

    return 0;
}


六、字符操作

1、字符分类函数

⚪【代码演示】

#include <stdio.h>
#include <ctype.h>

int main()
{
    char ch1 = 'a';
    int ret = islower(ch1); // 判断ch1是否为小写 -- 非0为真
    printf("%d\n", ret);

    char ch2 = 'B';
    int res = islower(ch2); // 判断ch2是否为小写 -- 0为假
    printf("%d\n", res);

    return 0;
}

注意:需引入头文件 ctype.h 头文件。 


2、字符转换

int tolower ( int c ); 
int toupper ( int c );

⚪【代码演示】 

#include <stdio.h>

int main()
{
    char ch = tolower('Q'); // 大写转小写
    putchar(ch);
 
    return 0;
}


七、内存操作函数

1、memcpy

 

  • 函数 memcpy 从 src 的位置开始向后复制 count 个字节的数据到 dest 的内存位置。
  • 这个函数在遇到 '\0' 的时候并不会停下来
  • 如果 src 和 dest 有任何的重叠,复制的结果都是未定义的。

 memcpy - C++ Reference (cplusplus.com)

⚪【模拟实现】 

#include <stdio.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

int main()
{
	char s1[] = "abcdefgh";
	char s2[20] = "xxxxxxxxxx";
	my_memcpy(s2, s1, 5);
	printf("%s\n", s2);
	return 0;
}

⚪【代码演示】 

// 拷贝结构体
#include <stdio.h>
#include <string.h>
 
struct S
{
    char name[20];
    int age;
};
 
int main()
{
    struct S arr3[] = { {"张三", 20}, {"李四", 30} };
    struct S arr4[3] = { 0 };
    memcpy(arr4, arr3, sizeof(arr3));

    return 0;
}

 


2、memmove

  • 和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的
  • 如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。

C语言标准要求:

memcpy 用来处理不重叠的内存拷贝,而 memmove 用来处理重叠内存的拷贝

memmove - C++ Reference (cplusplus.com)

⚪【模拟实现】

#include <stdio.h>
#include <assert.h>

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;

	//从前->后
	if (dest <= src)
	{
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}

	//从后->前
	else
	{
		dest = (char*)dest + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
	return ret;
}

int main()
{
	char arr[] = "abcdefgh";
	my_memmove(arr, arr + 3, 2);
	printf("%s\n", arr);
	return 0;
}


3、memset

 

  • memset 是以字节为单位设置内存的

memset - C++ Reference (cplusplus.com)

⚪【代码实现】 

#include <stdio.h>
#include <string.h>

int main()
{
    int arr[10] = { 0 };
    memset(arr, 1, 20); // 将前20个字节全部设置为1

    return 0;
}


4、memcmp

  • 比较从 buf和 buf指针开始的 count 个字节。

注意memcmp 不同于 strcmp,memcmp 遇到 '\0' 不会停止比较。

memcmp - C++ Reference (cplusplus.com)

⚪【代码演示】

#include <stdio.h>
#include <string.h>

int main()
{
    float arr1[] = { 1.0, 2.0, 3.0, 4.0 };
    float arr2[] = { 1.0, 3.0 };
    int ret = memcmp(arr1, arr2, 8); // arr1是否比arr2大,比较8个字节
    printf("%d\n", ret);

    return 0;
}

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

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

相关文章

LC-对称二叉树

LC-对称二叉树 链接:https://leetcode.cn/problems/symmetric-tree/description/ 描述&#xff1a;给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 例1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 例2&#xff1a; 输入&…

【C++】—— 详解AVL树

目录 序言 &#xff08;一&#xff09;AVL树的概念 1、AVL树的由来 2、AVL树的特点 3、平衡因子 &#xff08;二&#xff09;AVL树的插入 1、插入操作的思想理解 2、AVL树的旋转 1️⃣ LL平衡旋转&#xff08;右单旋转&#xff09; 2️⃣ RR平衡旋转&#xff08;左单…

基于Canal实现MySQL 8.0 数据库数据同步

前言 服务器说明 主机名称操作系统说明192.168.11.82Ubuntu 22.04主库所在服务器192.168.11.28Oracle Linux Server 8.7从库所在服务器 版本说明 <span style"color:#000000"><span style"background-color:#ffffff"><code class"la…

carla中lka实现(二)

前言&#xff1a; 首先计算之前检测出来的车道线的中线与输入图像的中线进行计算距离&#xff0c;&#xff0c;并设置不同的阈值对于不同的方向进行相关的调整。 一、车辆中心线 一般而言将摄像头架设在车辆的正中心轴上&#xff0c;所获得的图像的中间线极为车辆的中心。 …

激光雷达 01 线数

一、线数 对于 360 旋转式和一维转镜式架构的激光雷达来说&#xff0c;有几组激光收发模块&#xff0c;垂直方向上就有几条线&#xff0c;被称为线数。这种情况下&#xff0c;线数就等同于激光雷达内部激光器的数量[参考]。 通俗来讲&#xff0c;线数越高&#xff0c;激光器的…

Adobe Acrobat 无法使用 PS 编辑图片 的解决方法

问题描述 使用较新版本的Adobe Acrobat时&#xff0c;有时会遇到问题。 比如对pdf中的图片使用 PS 进行编辑&#xff0c;会弹出以下窗口&#xff0c;导致打不开 PS &#xff0c;无法对图片进行编辑。 Adobe 无法启动您指定的图像编辑应用程序。请在"首选项"的"…

【STM32CubeMX】低功耗模式

前言 本文讲解STM32F10X的低功耗模式&#xff0c;部分资料参考自STM32手册。STM32F10X提供了三种低功耗模式&#xff1a;睡眠模式&#xff08;Sleep mode&#xff09;、停机模式&#xff08;Stop mode&#xff09;和待机模式&#xff08;Standby mode&#xff09;。这些低功耗模…

双环传动CIO吴学信:数字化转型为企业高效运转和业绩腾飞提供重要支撑

引言 浙江双环传动机械股份有限公司&#xff08;股票代码&#xff1a;002472&#xff09;创建40年来专注于机械传动核心部件——齿轮及其组件的研发、制造与销售&#xff0c;已成为全球最大的专业齿轮产品制造商和服务商之一。 2019年以来&#xff0c;双环传动与纷享销客CRM建…

【0Ω电阻在PCB板中的5大常见作用】

文章目录 前言1、充当跳线2、进行调试时的前后级隔离3、让调试更灵活4、方便测试电流5、用于单点接地 前言 在PCB板中&#xff0c;时常见到一些阻值为0Ω的电阻。我们都知道&#xff0c;在电路中&#xff0c;电阻的作用是阻碍电流&#xff0c;而0Ω电阻显然失去了这个作用。那…

LC-将有序数组转换为二叉搜索树

LC-将有序数组转换为二叉搜索树 链接&#xff1a;https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索…

new String()到底创建了几个对象

题目&#xff1a; new String&#xff08;"abc"&#xff09;会创建几个对象&#xff1f; 看字节码&#xff0c;就知道是两个。

经验分享丨HR告诉你:同样是找工作,这些简历绝对会被直接刷掉!

上次的文章分享了自己软件测试面试时的一些经历&#xff0c;今天我想分享一下自己当时写简历以及投简历方面的经历&#xff0c;本文内容纯粹是个人简单分享&#xff0c;如果有写得不好的地方还请读者包涵与指正。 我是去年的九月初开始投递简历的&#xff0c;貌似各行各业的人都…

[JavaWeb]【七】web后端开发-MYSQL

前言&#xff1a;MySQL是一种流行的关系型数据库管理系统,它的作用是存储和管理数据。在Web开发中,MySQL是必备的数据库技能之一,因为它可以帮助Web开发人员处理大量的数据,并且提供了强大的数据查询和管理功能。 一 数据库介绍 1.1 什么是数据库 1.2 数据库产品 二 MySQL概述…

电煎锅出口欧洲CE认证标准

电煎锅是家庭烹饪中比较常见的电器&#xff0c;一般家庭在日常生活中都会使用&#xff0c;所以电煎锅具有广大的市场&#xff0c;尤其在欧洲市场更是日常烹饪离不开的家庭电器。欧洲是我国出口比例占比较大的地区&#xff0c;每年出口到欧洲的家庭电器占很大一部分。而根据欧盟…

3 Python的数据类型

概述 在上一节&#xff0c;我们介绍了Python的基础语法&#xff0c;包括&#xff1a;编码格式、标识符、关键字、注释、多行、空行、缩进、引号、输入输出、import、运算符、条件控制、循环等内容。Python是一种动态类型的编程语言&#xff0c;这意味着当你创建一个变量时&…

解决c/c++ Error: redefinition of ‘xxx’ 的问题

错误信息 两个类/文件同时引用定义ReplyInfo的头文件&#xff0c;会造成头文件中定义重复定义 如两个类/文件重复引用massage文件报错 message.h:36:16: error: redefinition of struct MSG_SERVOCTRL message.h:40:2: error: conflicting types for servoctrl解决 一般是目…

[SWPUCTF 2022 新生赛]ez_ez_php

这段代码是一个简单的PHP文件处理脚本。让我们逐行进行分析&#xff1a; error_reporting(0); - 这行代码设置了错误报告的级别为0&#xff0c;意味着不显示任何错误。 if (isset($_GET[file])) { - 这行代码检查是否存在一个名为"file"的GET参数。 if ( substr($_…

步步为赢:打造一个酷炫而吸引人的Hadoop HDFS分布式文件系统集群部署方案

文章目录 版权声明一 分布式存储缘起二 分布式的基础架构2.1 大数据架构模式2.2 主从模式 三 HDFS的基础架构HDFS的角色组成 四 HDFS集群环境部署4.1 安装包下载4.2 Hadoop安装包目录结构4.3 修改配置文件&#xff0c;应用自定义设置4.4 分发Hadoop文件夹4.5 配置环境变量4.6 授…

【论文笔记】基于指令回译的语言模型自对齐-MetaAI

MetaAI最近发布的Humpback&#xff0c;论文链接&#xff1a;https://arxiv.org/abs/2308.06259 解决什么问题&#xff1f; 大量高质量的指令微调数据集的生成。 思路 在这项工作中&#xff0c;我们通过开发迭代自训练算法来利用大量未标记的数据来创建高质量的指令调优数据集…

IC流程中 DFT 学习笔记(2)

引言 DFT是ASIC芯片设计流程中不可或缺的环节。其主要目的是在芯片前端设计验证完成后插入一些诸如寄存器链等可供测试的逻辑&#xff0c;算是IC后端设计的范畴&#xff0c;属于结构测试而非功能测试。主要是在ASIC芯片流片完成后&#xff0c;通过这些已插入的逻辑&#xff0c…