【C语言】字符串函数和内存函数详解

目录

一,求字符串长度

        1,strlen

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

        1,strcpy

        2,strcat

        3,strcmp

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

        1,strncpy

        2,strncat

        3,strncmp

四,字符串查找

        1,strstr

        2,strtok

五,错误信息报告

       1, strerror

六,字符操作

七,内存操作函数

        1,memcpy

        2,memmove

        3,memset

        4,memcmp

八,总结


一,求字符串长度

        1,strlen

size_t strlen ( const char * str );

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

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

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

        注

#include <stdio.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;
}

       此运行结果为  str1>str2  

       因为strlen函数的返回值是size_t类型的是无符号整型,所以返回值是一个大于等于0的数字

       strlen函数的模拟实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
size_t my_strlen(const char* str)
{
	int num = 0;
	while (*str++ != '\0')
	{
		num++;
	}
	return num;
}
int main()
{
	char arr[] = "abcde";
	int ret=my_strlen(arr);
	printf("%d", ret);
	return 0;
}

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

        1,strcpy

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

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

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

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

        目标空间必须可变

        strcpy函数的模拟实现如下:

#include<stdio.h>
char* my_strcpy(char* arr, const char* arr1)
{
	char* p = arr;
	while (*arr++ = *arr1++);
	return p;
}
int main()
{
	char arr[10] = "abcde";
	char arr1[] = "ghjkl";
	char* ret = my_strcpy(arr, arr1);
	printf("%s", arr);
	return 0;
}

        2,strcat

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

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

        目标空间必须有足够的大,能容纳下源字符串的内容

        目标空间必须可修改

        字符串自己给自己追加,如何?-----字符串自己给自己追加会崩溃的,因为'\0'会被覆盖,所以程序结束不了,死循环!

        3,strcmp

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

        标准规定:

        第一个字符串大于第二个字符串,则返回大于0的数字

        第一个字符串等于第二个字符串,则返回0

        第一个字符串小于第二个字符串,则返回小于0的数字

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

        1,strncpy

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

        拷贝num个字符从源字符串到目标空间

        如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个

         2,strncat

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

        dest要有足够的空间来容纳要拷贝的字符串

        strncat会将dest字符串最后的 ' \0 ' 覆盖掉,字符追加完成后,再追加 ' \0 ';

        3,strncmp

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

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

四,字符串查找

        1,strstr

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

         strstr函数是在字符串str1中查找是否含有字符串str2,如果存在,返回str2在str1中第一次出现的地址;否则返回NULL。

        strstr函数的模拟实现:

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* dest, const char* src)
{
	assert(dest&&src);
	char* s1 = dest;
	while (s1)
	{
		char* s2 = s1;
		char* s3 = src;
		while ((s2&&s3) && (*s2 == *s3))
		{
			s2++;
			s3++;
		}
		if (*s3 == '\0')
			return s1;
		if (*s2 == '\0')
			return NULL;
		s1++;
	}
}
int main()
{
	char arr[] = "abbbcdef";
	char brr[] = "bbc";
	char* ret = my_strstr(arr, brr);
	printf("%s", ret);
	return 0;
}

         2,strtok

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

         sep参数是个字符串,定义了用作分隔符的字符集合

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

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

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

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

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

strtok代码示例:

#include<stdio.h>
int main()
{
	char arr[] = "[email protected]";
	char arr1[] = ".@";
	char* ret = 0;
	for (ret = strtok(arr, arr1); ret != 0;ret=strtok(0,arr1))
	{
		printf("%s\n", ret);
	}
	return 0;
}

五,错误信息报告

       1, strerror

char * strerror ( int errnum );

        c语言的库函数在执行失败时,都会有一个错误码( 0,1,2,3,4,5,6,7,8,9......) 

        返回错误码,所对应的错误信息

        errno  是一个全局的错误码变量

        当c语言的库函数在执行过程中,发生了错误,就会把对应的错误码,复制到errno中

        strerror代码演示:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<errno.h>
int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	return 0;

六,字符操作

        字符分类函数:

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
isdigit 十进制数字 0~9
isxdigit 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 字母a~z或者A~Z
isalnum 字母或者数字,a~z,A~Z,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
i's'isgraph 任何图形字符
isprint 然后可打印字符,包括图形字符和空白字符

        字符转换:

int tolower ( int c );

int toupper ( int c );

七,内存操作函数

        1,memcpy

void * memcpy ( void * destination, const void * source, size_t num );

        函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置

        这个函数在遇到 '\0' 的时候并不会停下来

        如果source和destination有任何的重叠,复制的结果都是未定义的

        memcpy函数模拟实现:

void* my_memcpy(void* dest, const void* src, size_t num)
{
	while (num--)
	{
		*(char*)dest = *(char*)src;
		(char*)dest += 1;
		(char*)src += 1;
	}
}
int main()
{
	char arr[] = "abcde";
	char arr1[] = "gjk";
	my_memcpy(arr, arr1, sizeof(arr1[0]) * 2);
	printf("%s", arr);
}

         2,memmove

void * memmove ( void * destination, const void * source, size_t num )

        和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的

        如果源空间和目标空间出现重叠,就得使用memmove函数处理

        memmove函数模拟实现:

void* my_memmove(void* dest, const void* src, size_t num)
{
	if (dest <= src)
	{
		while (num--)
			{
				*(char*)dest = *(char*)src;
				(char*)dest += 1;
				(char*)src += 1;
			}
	}
	else
	{
		while (num--)
		{
			*((char*)dest+num) = *((char*)src+num);
		}
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8 };
	my_memmove(arr + 3, arr + 2, sizeof(arr[0]) * 3);
	int i = 0;
	for (i = 0; i < 8; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

        3,memset

void* memset ( void* dest , int c , size_t num );

        memset是一个初始化函数,作用是将某一块内存中的全部设定为指定的值

        memset代码示例:

#include<stdio.h>
int main()
{
	char arr[] = "abcde";
	memset(arr + 1, '#', sizeof(arr[0]) * 3);
	printf("%s", arr);
	return 0;
}

        4,memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

        比较从ptr1和ptr2指针开始的num个字节

        返回值如下:

        memcmp代码示例:

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	char brr[] = "abcghj";
	int ret = memcmp(arr, brr, sizeof(arr[0]) * 3);
	printf("%d\n", ret);
    ret=memcmp(arr, brr, sizeof(arr[0]) * 4);
	printf("%d", ret);
	return 0;
}

八,总结

        本篇文章经查阅无数资料精心打造,文章可读性高,对于初学者和复习都具有着非常不错的效果!

        建议收藏反复揣摩!

猜你喜欢

转载自blog.csdn.net/m0_71676870/article/details/131752404