第十四讲:C语言字符函数和字符串函数

news2025/1/21 5:59:02

目录

1. 字符分类函数

2、字符转换函数

3. strlen的使⽤和模拟实现

4. strcpy 的使⽤和模拟实现

5. strcat 的使⽤和模拟实现

6. strcmp 的使⽤和模拟实现

7. strncpy 函数的使⽤

8. strncat 函数的使⽤

9. strncmp函数的使⽤

10. strstr 的使⽤和模拟实现

11. strtok 函数的使⽤

12. strerror 函数的使⽤

13、atoi函数的使用和模拟


正⽂开始

在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

1. 字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

首先第一个函数原型为:

int iscntrl(int c);

检查所传的字符是否是控制字符。

如果 c 是一个控制字符,则该函数返回非零值,否则返回 0。

例如:可以用以下程序判断是否为控制字符

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = '\a';
	printf("%d ", iscntrl(c));

	return 0;
}

第二个函数的函数原型为:

int isspace(int c);

 检查所传的字符是否是空白字符。

如果 c 是一个空白字符,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = ' ';
	printf("%d ", isspace(c));

	return 0;
}

第三个函数原型为:

int isdigit(int c);

检查所传的字符是否是十进制数字字符。

如果 c 是一个数字,则该函数返回非零值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = '8';
	printf("%d ", isdigit(c));

	return 0;
}

第四个函数原型为:

int isxdigit(int c);

检查所传的字符是否是十六进制数字,十六进制一般用数字 0 到 9 和字母 A 到 F(或 a~f)表示,其中 A~F 表示 10~15: 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

如果 c 是一个十六进制数字,则该函数返回非零的整数值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = '8';
	printf("%d ", isxdigit(c));

	return 0;
}

第五个函数原型为:

int islower(int c);

检查所传的字符是否是小写字母。

如果 c 是一个小写字母,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'a';
	printf("%d ", islower(c));

	return 0;
}

第六个函数声明为:

int isupper(int c);

检查所传的字符是否是大写字母。

如果 c 是一个大写字母,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'A';
	printf("%d ", isupper(c));

	return 0;
}

 第七个函数原型为:

int isalpha(int c);

 检查所传的字符是否是字母。

如果 c 是一个字母,则该函数返回非零值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'A';
	printf("%d ", isalpha(c));

	return 0;
}

第八个函数原型为:

int isalnum(int c);

检查所传的字符是否是字母和数字。

如果 c 是一个数字或一个字母,则该函数返回非零值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = '5';
	printf("%d ", isalnum(c));

	return 0;
}

第九个函数原型为:

int ispunct(int c);

检查所传的字符是否是标点符号字符。

如果 c 是一个标点符号字符,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = ',';
	printf("%d ", ispunct(c));

	return 0;
}

第十个函数原型为:

int isgraph(int c);

检查所传的字符是否有图形表示法。带有图形表示法的字符是除了空白字符(比如 ' ')以外的所有可打印的字符。

如果 c 有图形表示法,则该函数返回非零值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'k';
	printf("%d ", isgraph(c));

	return 0;
}

第十一个函数原型为:

int isprint(int c);

 检查所传的字符是否是可打印的。可打印字符是非控制字符的字符。

如果 c 是一个可打印的字符,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'k';
	printf("%d ", isprint(c));

	return 0;
}

上面的代码都十分简单,下面来一个题目,体会一下字符分类函数:

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

例如:

#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c -= 32;
		putchar(c);
		i++;
	}
	return 0;
}

运行结果为:

2、字符转换函数

C语⾔提供了2个字符转换函数:

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数,就可以直接使⽤ tolower 函 数。

#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c = toupper(c);
		putchar(c);
		i++;
	}
	return 0;
}

3. strlen的使⽤和模拟实现

函数原型为:

size_t strlen ( const char * str );

• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。

• 参数指向的字符串必须要以 '\0' 结束。

• 注意函数的返回值为size_t,是⽆符号的( 易错 )

• strlen的使⽤需要包含头⽂件 string.h

例如我们看一道程序:

#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

运行结果为:

很明显,结果与我们的预期不符,实际上这是由于strlen函数的返回值导致的,size_t的返回值是无符号的整形,两个size_t的数相减仍为一个size_t的数,所以结果会是一个正数,在这一点一定要注意,因为比较容易出错。

strlen的模拟实现:

⽅式1:

/计数器⽅式
int my_strlen(const char* str)
{
	int count = 0;
	assert(str);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

⽅式2:

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

⽅式3:

//指针-指针的⽅式
int my_strlen(char* str)
{
	assert(str);
	char* p = str;
	while (*p !='\0')
		p++;
	return p - str;
}

4. strcpy 的使⽤和模拟实现

函数原型为:

char* strcpy(char * destination, const char * source );

• 源字符串必须以 '\0' 结束。

• 会将源字符串中的 '\0' 拷⻉到⽬标空间。

• ⽬标空间必须⾜够⼤,以确保能存放源字符串。

• ⽬标空间必须可修改。

strcpy的模拟实现:

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);

	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

5. strcat 的使⽤和模拟实现

函数原型为:

char *strcat(char *dest, const char *src)

• 源字符串必须以 '\0' 结束。

• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

• ⽬标空间必须可修改。

• 使用strcat函数不要让字符串给自己追加,也就是strcat函数的两个参数不能相同。

模拟实现strcat函数:

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

6. strcmp 的使⽤和模拟实现

函数原型为:

int strcmp(const char *str1, const char *str2)

• 标准规定:

◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

◦ 第⼀个字符串等于第⼆个字符串,则返回0

◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

strcmp函数的模拟实现:

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

7. strncpy 函数的使⽤

函数原型为:

char * strncpy ( char * destination, const char * source, size_t num );

• 拷⻉num个字符从源字符串到⽬标空间。

• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

模拟实现:

char* my_strncpy(char* dst, const char* src, size_t n)
{
	int i;
	for (i = 0; src[i] && i < n; i++)
	{
		dst[i] = src[i];
	}
	if (i < n)
	{
		dst[i] = 0;
	}
	
	return dst;
}

8. strncat 函数的使⽤

函数原型为:

char *strncat(char *dest, const char *src, size_t n)

将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符。

如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。

模拟实现:

char* my_strcat(char* dst, const char* src, size_t n)
{
	char* tmp = dst;
	while (*dst)
	{
		dst++;
	}
	int i;
	for (i = 0; src[i] && i < n; i++)
	{
		dst[i] = src[i];
	}
	dst[i] = 0;
	return tmp;
}

例如:

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20];
	char str2[20];
	strcpy(str1, "To be ");
	strcpy(str2, "or not to be");
	strncat(str1, str2, 6);
	printf("%s\n", str1);
	return 0;
}

运行结果为:

9. strncmp函数的使⽤

函数原型为:

int strncmp ( const char * str1, const char * str2, size_t num );

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

用法与strcmp基本一样,就是要指定比较前多少项。

10. strstr 的使⽤和模拟实现

函数原型为:

 char * strstr ( const char * str1, const char * str2);

函数返回字符串str2在字符串str1中第⼀次出现的位置

字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	strncpy(pch, "sample", 6);
	printf("%s\n", str);
	return 0;
}

运行结果为:

strstr的模拟实现:

char* strstr(const char* str1, const char* str2)
{
	char* cp = (char*)str1;
	char* s1, * s2;
	if (!*str2)
		return((char*)str1);

	while (*cp)
	{
		s1 = cp;
		s2 = (char*)str2;
		while (*s1 && *s2 && !(*s1 - *s2))
			s1++, s2++;
		if (!*s2)
			return(cp);
		cp++;
	}

	return(NULL);
}

11. strtok 函数的使⽤

函数原型为:

char * strtok ( char * str, const char * sep);

• sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合

• 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标 记。

• strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容 并且可修改。)

• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串 中的位置。

• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标 记。

• 如果字符串中不存在更多的标记,则返回 NULL 指针。

例如:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "192.168.6.111";
	char* sep = ".";
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s\n", str);
	}
	return 0;
}

运行结果为:

例如:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "wang@year,net";
	char copy[20];
	strcpy(copy, arr);
	char sep[] = "@,";
	char* ret = strtok(copy, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	return 0;
}

运行结果为:

12. strerror 函数的使⽤

函数原型为:

char * strerror ( int errnum );

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应 的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

注:一次只能打印一个错误。但是错误码可能会发生变化,只要是检测出一个与之前不同的错误,错误码就会随之改变。

另外,编译器报出的是语法错误,而这个错误码对应的错误信息是程序运行时的错误。

#include <string.h>
#include <stdio.h>
//我们打印⼀下0到10这些错误码对应的错误信息
int main()
{
	int i = 0;
	for (i = 0; i <= 10; i++) {
		printf("%s\n", strerror(i));
	}
	return 0;
}

运行结果为:

例如:

#include <stdio.h>
#include <string.h>
int main()
{
	FILE* pFile;
	pFile = fopen("unexist.ent", "r");
	if (pFile == NULL)
		printf("Error opening file unexist.ent: %s\n", strerror(errno));
	return 0;
}

运行结果为:

也可以了解⼀下perror函数,perror函数相当于⼀次将上述代码中的第9⾏完成了,直接将错误信息打 印出来。

perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。这个函数需要头文件stdio.h

例如:

#include <stdio.h>
int main()
{
	FILE* pFile;
	pFile = fopen("unexist.ent", "r");
	if (pFile == NULL)
		perror("Error opening file unexist.ent");
	return 0;
}

运行结果为:

13、atoi函数的使用和模拟

函数原型为:

int atoi(const char *str)

把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

模拟实现:

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<limits.h>
#include<ctype.h>
int my_atoi(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}
	long long ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{
			ret = ret * 10 + flag * (*str - '0');
			if (ret > INT_MAX || ret < INT_MIN)
			{
				return 0;
			}
		}
		else
		{
			return (int)ret;
		}
		str++;
	}
	return (int)ret;

}

欢迎读者到评论区留言,或者私信。

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

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

相关文章

云原生之旅第一课(2站搜索K8s成神之路)

自己动手搭建Kubernetes集群&#xff0c;学习如何自定义CRD&#xff0c;以及使用Kubebuilder快速搭建Operator项目&#xff0c;云原生之旅第一课。从一开始准备录制课程&#xff0c;到如今已经有了500位忠实粉丝&#xff0c;我感到无比欣慰。这门课程完全开源&#xff0c;每一集…

C++【组合模式】

简单介绍 组合模式是一种结构型设计模式&#xff0c; 只有在可以将对象拆分为【树状结构】的情况下使用。并且像使用独立对象一样使用它们。 常用于表示与图形打交道的用户界面组件或代码的层次结构。 基础理解 Q&#xff1a;为什么要用组合模式 &#xff1f; A&#xff1a;在…

JavaScript - 你知道数组去重都有哪些实现方案吗

难度级别:初级及以上 提问概率:70% 数组去重是一道非常经典而又高频的面试题,这里我们提出6种解决方案: 目录 1 第一种 2 第二种 3 第三种 4 第四种

Tokenize Anything via Prompting

SAM的延续&#xff0c;把SAM输出的token序列用来进行分类&#xff0c;分割和一个自然语言的decoder处理&#xff0c;但其实现在多模态的图像的tokenizer也几乎都是用VIT来实现的。一开始认为这篇文章可能是关于tokenize的&#xff0c;tokenize还是很重要的&#xff0c;后来看完…

MUX VLAN

目录 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.使用Hybrid端口实现网络需求 3.使用Mux VLAN实现网络需求 原理概述 在实际的企业网络环境中&#xff0c;往往需要所有的终端用户都能够访问某些特定的服务器&#xff0c;而用户之间的访问控制规则则比较复杂。在…

Mysql启动报错:本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

Mysql启动报错&#xff1a;本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止 文章目录 Mysql启动报错&#xff1a;本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止1. 备份mysql的data文件夹2. 重新构建 Wind…

helm与k8s

文章目录 一、helm二、K8S/K3S1.K8S基本组件1.1 资源对象1.2 核心组件1.3典型的创建 Pod 的流程1.4 Kubernetes 多组件之间的通信原理 2. YAML 文件2.1 Maps2.2 Lists2.3 使用 YAML 创建 Pod2.4 创建 Deployment 4.静态pod4.1 配置文件4.2 通过 HTTP 创建静态 Pods4.3 静态pods…

【Linux系列】如何确定当前运行的是 RHEL 9 还是 RHEL 8?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

zheng项目:从零到一打造全方位J2EE企业级开发解决方案

zheng项目&#xff1a;从零到一打造全方位J2EE企业级开发解决方案 摘要&#xff1a; 在当今快速发展的企业级应用开发领域&#xff0c;一套高效、稳定且可扩展的解决方案对于企业的成功至关重要。zheng项目旨在提供一套全面的J2EE企业级开发解决方案&#xff0c;从前端模板到自…

学习人工智能:为何PyTorch深度学习框架不可或缺

在人工智能&#xff08;AI&#xff09;的浩瀚领域中&#xff0c;深度学习作为其核心分支&#xff0c;正以其强大的数据处理能力、模式识别能力和预测能力引领着科技的飞速发展。而在深度学习的众多工具与框架中&#xff0c;PyTorch无疑是一颗璀璨的明星。本文将从PyTorch的特点…

单片机为什么还在用C语言编程?

单片机产品的成本是非常敏感的。因此对于单片机开发来说&#xff0c;最重要的是在极其有限的ROM和RAM中实现最多产品的功能。或者反过来说&#xff0c;实现相同的产品功能&#xff0c;所需要的ROM和RAM越小越好&#xff0c;在开始前我有一些资料&#xff0c;是我根据网友给的问…

JMeter+Ant+Jenkins构建接口报告(无人驾驶版)

展示结果&#xff1a; uc浏览器打开测试报告&#xff0c;绿色显示脚本结果 搭建操作步骤如下 1.jemter写好脚本 2.下载并配置ant环境变量&#xff1a;加上activation.jar、commons-lang3-3.8.1.jar、mail.jar 这3个包 mail.jar需要引用到jmeter 3.下载安装Jenkins 并进行构建…

算法 - 符号表-上

&#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 算法 - 符号表前言初级实现1. 链表实现无序符号表2. 二分查找实现有序符号表 二叉查找树1. get()2. put()3. 分析4. floor()5. rank()6. min()7. deleteMin()8. delete()9. keys()10. 分析 算法 - 符号表 前言 符号表&am…

MQTT的学习

近期构建物联网平台&#xff0c;学习到MQTT&#xff0c;这里使用的是uniapp作为连接MQTT broker的&#xff0c;这里使用的是国产的EMQX。 MQTT的认识 MQTT 协议入门&#xff1a;基础知识和快速教程 | EMQ&#xff08;简单的认识&#xff09; 创建 MQTT 连接时如何设置参数&am…

前端开发语言有那些?

前端开发语言有那些&#xff1f; 1、html 超文本标记语言&#xff1a;构建前端网页的基本结构&#xff0c;就象人的骨架一样。 2、css 层叠样式表&#xff1a;控制网页的样式和布局&#xff0c;就象人需要穿各种服式展现不同风采。 3、javascript 简称 JS 动态脚本语言&#x…

微信小程序云函数调用方法和技术架构介绍

云函数 云函数是涂鸦根据微信小程序使用场景&#xff0c;结合涂鸦 IoT 开放能力&#xff0c;提供的小程序访问涂鸦 IoT 开放能力接口方案。为此在基础能力中&#xff0c;我们提供了基础请求云函数的 API。 对于特殊的业务场景&#xff0c;需要使用云函数访问业务数据的&#…

智慧园区预约管理系统:提升效率与保障安全的关键

在当今这个信息技术高度发达的时代&#xff0c;智慧园区如雨后春笋般迅速发展&#xff0c;而预约管理作为智慧园区的关键组成部分&#xff0c;其重要性日益凸显。 访客预约系统的精细化设计&#xff0c;为园区的安全和秩序提供了坚实可靠的保障。访客可以通过便捷的在线平台&am…

django系统模板

【一】引子 来看一段代码 def current_datetime(request):now datetime.datetime.now()html "<html><body>It is now %s.</body></html>" % nowreturn HttpResponse(html)直接把HTML页面嵌套在视图函数里返回给浏览器并不是一个好主意&a…

2024年天津中德应用技术大学退役大学生专升本专业考试准考证下载

2024年天津中德应用技术大学退役大学生高职升本科专业课考试准考证下载及考生须知 一、准考证下载打印 4月7日14点开始&#xff0c;天津中德应用技术大学专业课报名审核通过的考生&#xff0c;登录天津中德应用技术大学专业课报名系统&#xff08;http://125.65.42.21:8091/j…

【实战解析】YOLOv9全流程训练至优化终极指南

【实战解析】YOLOv9全流程训练至优化终极指南 0.引言1.环境准备2.数据预处理&#xff08;1&#xff09;数据准备&#xff08;2&#xff09;按比例划分数据集&#xff08;3&#xff09;xml转txt脚本&#xff08;4&#xff09;配置文件 3.模型训练&#xff08;1&#xff09;单GPU…