C语言学习笔记(字符串+内存函数介绍)

103 阅读2分钟

​「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。

函数介绍

求字符串长度:

strlen

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

strcpy

strcat

strcmp

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

strncpy

strncat

strncmp

字符串查找:

strstr

strtok

错误信息报告:

strerror


正文开始~

1.strlen

size_t strlen(const char* str);

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

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

3.函数的返回值为size_t,是无符号的

例:

int main()
{
	int len = strlen("abcdef");
	printf("%d\n", len);
	return 0;
}

输出值为:6

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	int len = strlen(arr);
	printf("%d\n", len);
	return 0;
}

输出值为;随机值

实现strlen函数的方法:

//1.计数器的方法 如下
//2.递归(不创建临时变量求字符串长度)
//3.指针减指针

模拟实现:

#include<assert.h>
int my_strlen(const char* str)
{
	int count = 0;
	assert(str != NULL);
	while (*str != '\0')//while(*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	int len = my_strlen("abcdef");
	printf("%d\n", len);
	return 0;
}

2.1 strcpy

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

1.源字符串必须以 '\0'结束

//错误的示范
char arr2[] = {'a','b','c'};

2.会将源字符串中的'\0'拷贝到目标空间

3.目标空间必须足够大,以确保可以存放源字符串

模拟实现:

 char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	//拷贝src指向的字符串到dest指向的空间,包含'\0'
	while (*dest++ = *src++)
	{
		;
	}
	//返回目的空间的起始地址
	return ret;
}
int main()
{
	char arr1[] = "abcdefghi";
	char arr2[] = "bit";

	my_strcpy(arr1, arr2);//
	printf("%s\n", arr1);

	return 0;
}

2.2 strcat

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

1.源字符串必须以 '\0'结束

2.目标空间必须足够大,以确保可以容纳下源字符串的内容

3.目标空间必须可修改

int main()
{
	char arr1[] = "hello";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}


函数介绍

求字符串长度:

strlen

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

strcpy

strcat

strcmp

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

strncpy

strncat

strncmp

字符串查找:

strstr

strtok

错误信息报告:

strerror


正文开始~

1.strlen

size_t strlen(const char* str);

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

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

3.函数的返回值为size_t,是无符号的

例:

int main()
{
	int len = strlen("abcdef");
	printf("%d\n", len);
	return 0;
}

输出值为:6

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	int len = strlen(arr);
	printf("%d\n", len);
	return 0;
}

输出值为;随机值

实现strlen函数的方法:

//1.计数器的方法 如下
//2.递归(不创建临时变量求字符串长度)
//3.指针减指针

模拟实现:

#include<assert.h>
int my_strlen(const char* str)
{
	int count = 0;
	assert(str != NULL);
	while (*str != '\0')//while(*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	int len = my_strlen("abcdef");
	printf("%d\n", len);
	return 0;
}

2.1 strcpy

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

1.源字符串必须以 '\0'结束

//错误的示范
char arr2[] = {'a','b','c'};

2.会将源字符串中的'\0'拷贝到目标空间

3.目标空间必须足够大,以确保可以存放源字符串

模拟实现:

 char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	//拷贝src指向的字符串到dest指向的空间,包含'\0'
	while (*dest++ = *src++)
	{
		;
	}
	//返回目的空间的起始地址
	return ret;
}
int main()
{
	char arr1[] = "abcdefghi";
	char arr2[] = "bit";

	my_strcpy(arr1, arr2);//
	printf("%s\n", arr1);

	return 0;
}

2.2 strcat

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

1.源字符串必须以 '\0'结束

2.目标空间必须足够大,以确保可以容纳下源字符串的内容

3.目标空间必须可修改

int main()
{
	char arr1[] = "hello";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}

\

​​

函数介绍

求字符串长度:

strlen

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

strcpy

strcat

strcmp

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

strncpy

strncat

strncmp

字符串查找:

strstr

strtok

错误信息报告:

strerror


正文开始~

1.strlen

size_t strlen(const char* str);

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

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

3.函数的返回值为size_t,是无符号的

例:

int main()
{
	int len = strlen("abcdef");
	printf("%d\n", len);
	return 0;
}

输出值为:6

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	int len = strlen(arr);
	printf("%d\n", len);
	return 0;
}

输出值为;随机值

实现strlen函数的方法:

//1.计数器的方法 如下
//2.递归(不创建临时变量求字符串长度)
//3.指针减指针

模拟实现:

#include<assert.h>
int my_strlen(const char* str)
{
	int count = 0;
	assert(str != NULL);
	while (*str != '\0')//while(*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	int len = my_strlen("abcdef");
	printf("%d\n", len);
	return 0;
}

2.1 strcpy

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

1.源字符串必须以 '\0'结束

//错误的示范
char arr2[] = {'a','b','c'};

2.会将源字符串中的'\0'拷贝到目标空间

3.目标空间必须足够大,以确保可以存放源字符串

模拟实现:

 char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	//拷贝src指向的字符串到dest指向的空间,包含'\0'
	while (*dest++ = *src++)
	{
		;
	}
	//返回目的空间的起始地址
	return ret;
}
int main()
{
	char arr1[] = "abcdefghi";
	char arr2[] = "bit";

	my_strcpy(arr1, arr2);//
	printf("%s\n", arr1);

	return 0;
}

2.2 strcat

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

1.源字符串必须以 '\0'结束

2.目标空间必须足够大,以确保可以容纳下源字符串的内容

3.目标空间必须可修改

int main()
{
	char arr1[] = "hello";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}

Y_YH@CUKSW`4255$KQ4SIY7.png

虽然可以将world加到hello的后面,但是却报错了这是为什么呢?

这是因为arr1周围栈区损坏,arr1中的位置不够