0
点赞
收藏
分享

微信扫一扫

C语言字符串函数总结

快乐小码农 2022-02-11 阅读 30

<string.h>库中有很多常用的字符串函数,萌新博主在此做了一些小总结.

目录

1.strlen

2.strcpy

 3.strcat

4.strcmp

5.strncpy

6.strncat

7.strncmp

8.strstr

 9.strtok

10.strerror

 11.memcpy

12.memmove

13.memcmp


1.strlen

函数原型:size_t strlen ( const char * str );

功能:计算字符串长度.

参数:str 要计算的字符串

返回值:返回字符串长度不包括'\0'

示例:

int main()
{
	char str[] = "abcdef";
	printf("%d\n", strlen(str));
	//结果为6
	return 0;
}

 模拟实现:

//计数器方法
int my_strlen1(const char *str)
{
	int count = 0;
	assert(str);
	while (*str++)
	{
		count++;
	}
	return count;
}

//指针减指针
int my_strlen2(const char *str)
{
	char *p = str;
	assert(str);
	while (*str)
		str++;
	return str - p;
}

//递归
int my_strlen2(const char *str)
{
	assert(str);
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
	{
		return 0;
	}
}

2.strcpy

函数原型:char* strcpy(char * destination, const char * source );

功能:将一个字符串拷贝到另一处

参数:source 要拷贝的字符串源头; destination 将要拷贝字符串放置的位置;

返回值:返回拷贝完成的字符串的地址

注意:将要放置字符串的位置的空间应该大于将要拷贝的字符串.

示例:

int main()
{
	char str1[10] = { 0 };
	char str2[] = "abcdef";
	printf("%s\n", strcpy(str1, str2));
	//结果为abcdef
	return 0;
}

 模拟实现:

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

 3.strcat

函数原型:char * strcat ( char * destination, const char * source );

功能:将一个字符串拷贝到另一个字符串末尾.

参数:source 将要拷贝的字符串,destination 拷贝到这个字符串的末尾

返回值:返回拷贝完成后的地址

示例:

int main()
{
	char str1[10] = "abc";
	char str2[] = "def";
	printf("%s\n", strcat(str1, str2));
	//结果abcdef

	return 0;
}

模拟实现:

char* my_strcat(char *dest, const char *src)
{
	char *tmp = dest;
	assert(dest && src);
	while (*dest)//找到结尾
		dest++;
	while (*src)
	{
		*dest++ = *src++;
	}
	return tmp;
}

4.strcmp

函数原型:int strcmp ( const char * str1, const char * str2 );

功能:字符串比较,按ASCII码表比较字符

参数:str1,str2 将要比较的两个字符串

返回值:str1大于str2返回大于0的数字:str1等于str2返回0;str1小于str2返回小于0的数字

示例:

int main()
{
	char str1[] = "abcd";
	char str2[] = "acde";
	int tmp = strcmp(str1, str2);
	if (tmp > 0)
	{
		printf("str1 > str2\n");
	}
	else if (tmp < 0)
	{
		printf("str1 < str2\n");
	}
	else
	{
		printf("str1 = str2\n");
	}
	//结果str1 < str2
	return 0;
}

模拟实现:

int my_strcmp(const char *dest, const char *src)
{
	assert(dest && src);

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

5.strncpy

函数原型: char * strncpy ( char * destination, const char * source, size_t num );

功能: 拷贝n个字符从源字符串到目标空间.

参数: destination 拷贝目的地 source 拷贝源头 num 拷贝字符的个数

返回值: 返回拷贝完成后的地址

示例:

int main()
{
	char str1[] = "abcdefg";
	char str2[10] = { 0 };
	printf("%s\n", strncpy(str2, str1, 3));
	//结果abc
	return 0;
}

6.strncat

函数原型: char * strncat ( char * destination, const char * source, size_t num );

功能: 将源头的n个字符拷贝到目的地末尾再加上'\0'

参数: destination 拷贝目的地, sourse 拷贝源头, num 拷贝的个数

返回值: 返回拷贝完成后的地址

示例:

int main()
{
	char str1[10] = "abc";
	char str2[] = "defgh";
	printf("%s\n", strncat(str1, str2, 3));
	//结果abcdef
	return  0;
}

7.strncmp

函数原型: int strncmp ( const char * str1, const char * str2, size_t num );

功能: 比较到出现不一样的字符或者一个字符串结束或者n个字符全部比较完.

参数: str1,str2 两个要比较的字符串 num 要比较的字符个数

返回值: str1大于str2返回大于0的数字:str1等于str2返回0;str1小于str2返回小于0的数字

示例:

int main()
{
	char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
	int n;
	puts("Looking for R2 astromech droids...");
	for (n = 0; n < 3; n++)
		if (strncmp(str[n], "R2xx", 2) == 0)
		{
			printf("found %s\n", str[n]);
		}
	//结果:
	//found R2D2
	//found R2A6
	return 0;
}

8.strstr

函数原型: char * strstr ( const char *str1, const char * str2);

功能: 字符串查找函数,在字符串str1中查找字符串str2

参数: str1将要查找的字符串,str2将要查找的字符串

返回值: 返回查找到相同位置的地址

示例:

//示例1
int main()
{
	char str1[] = "hello whord!";
	char str2[] = "ell";
	printf("%s", strstr(str1, str2));
	//结果ello whord!
	return 0;
}
//示例2
int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  pch = strstr (str,"simple");
  strncpy (pch,"sample",6);
  puts (str);
  //结果This is a simple string
  return 0;
}

 9.strtok

函数原型: char * strtok ( char * str, const char * sep );

功能: 在字符串中找分隔符标志,然后进行分割

参数 str 将要被查找的字符串,sep 分隔符的字符串可以是多个分隔符

返回值: 第一次调用返回第一段字符串的地址 , 当str参数输入NULL时返回下一段字符串的地址,字符串结束时返回NULL

示例:

int main()
{
	char str1[] = "hell#o wh$ord";
	char str2[] = "#$";
	char* pstr = NULL;
	for (pstr = strtok(str1, str2); pstr; pstr = strtok(NULL, str2))
	{
		printf("%s\n", pstr);
	}
	//结果
	//hell
	//o wh
	//ord
	return 0;
}

10.strerror

函数原型: char * strerror ( int errnum );

功能: 根据错误码返回错误信息

参数: ermun 错误码

返回值: 错误信息的地址

补充:strerror函数配合全局变量errno使用

errno头文件<errno.h>


	printf("错误信息: %s", strerror(errno));

 11.memcpy

函数原型: void * memcpy ( void * destination, const void * source, size_t num );

功能: 内存拷贝

参数 destination 拷贝的目的地 source 拷贝的源头 num 拷贝的字节数

返回值: 返回void*类型的 目的地的地址

示例

int main()
{
	int a[] = { 1, 5, 6, 848, 4, 11, 3, 51, 9 };
	int b[20] = { 0 };
	int i = 0;
	memcpy(b, a, sizeof(int) * 8);
	for (i = 0; i < 20; i++)
	{
		printf("%d ", b[i]);
	}
	//结果1 5 6 848 4 11 3 51 0 0 0 0 0 0 0 0 0 0 0 0
	return 0;
}

模拟实现:

void* my_memcpy(void* dest, const void* src, size_t n)
{
	void* tmp = dest;
	assert(dest);
	assert(src);

	while (n--)
	{
		*(char*)dest = *(char*)src;
		(char*)dest += 1;
		(char*)src += 1;

	}

	return tmp;
}

12.memmove

函数原型: void * memmove ( void * destination, const void * source, size_t num );

功能:功能和memmove相同但是可以处理字符串重叠的情况,可以取代memcpy

参数: destination 拷贝的目的地 source 拷贝的源头 num 拷贝的字节数

返回值: 返回void*类型的 目的地的地址

模拟实现:

void* my_memmove(void* dest, const void* src, size_t n)
{
	void* tmp = dest;
	assert(dest);
	assert(src);
	if (dest < src)//从前往后拷贝
	{
		while (n--)
		{
			*(char*)dest = *(char*)src;
			src = (char*)src + 1;
			(char*)dest += 1;
		}
	}
	else
	{
		while (n--)
		{
			*((char*)dest + n - 1) = *((char*)src + n - 1);
		}
	}
	return tmp;
}

13.memcmp

函数原型: int memcmp ( const void * ptr1, const void * ptr2, size_t num );

功能:内存比较函数,按字节进行比较,

参数: ptr1 ptr2将要比较的两个内存地址 num 要比较的字节数

返回值: ptr1大于ptr2返回大于0的数字:ptr1等于ptr2返回0;ptr1小于ptr2返回小于0的数字

举报

相关推荐

0 条评论