字符串操作函数详解

本文详细介绍了C语言中的字符串操作函数如strlen、strcpy、strcat、strcmp,以及查找函数strstr和字符串分割函数strtok的使用方法。通过实例演示了这些函数在实际编程中的应用,涵盖了长度计算、拷贝、追加、比较和分割等关键操作。
摘要由CSDN通过智能技术生成

目录

求字符串长度

strlen

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

strcpy

strcat

strcmp

长度受限制的字符串操作函数

strncpy

strncat

字符串查找函数

           strstr

字符串分割函数

strtok:


求字符串长度

strlen

声明:

size_t strlen(const char *str)

介绍:

该函数是求字符串 str 长度,直到 '\0' 结束,且不包括 '\0 '。

参数:

str----要计算长度的字符串。

返回值:

返回值类型为size_t类型,相当与无符号整型,返回值为字符串str的长度。

使用:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = { "hollow" };
	printf("%d", strlen(arr1));
}

编译结果为:6

 函数模拟实现:

size_t my_strlen(const char* p)
{
	assert(p);
	if (* p == '\0')
		return 0;
	return 1 + my_strlen(p+1);
}

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

strcpy

声明:

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

介绍: 

字符串拷贝函数,将字符串 src 拷贝至 dest 

参数:

dest----拷贝的目的地,即目标字符串。

src----被拷贝的字符串。

返回值:

返回类型为 char*,字符串指针,返回最终目标字符串dest的指针。

注意事项:

(1)目标字符串必须可变。

(2)目标字符串的存储空间必须足够大。

(3)拷贝时会将 '\0' 拷贝上。

使用:

int main()
{
	char a[20] = { "abcdefg" };
	char b[4] = { "xxx" };
	strcpy(a, b);
	printf("%s",a);
}

编译结果:xxx

模拟实现:

char* my_strcpy(char*a,const char* b)
{
	 assert(a && b);
	 char* p = a;
	 while (*a++ = *b++);
	 return p;
}

strcat

声明:

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

 介绍:

字符串追加函数,将src所指向的字符串追加至dest所指向字符串的末尾,会将dest所指向字符串末尾的 '\0' 覆盖。

参数:

dest----指向目标数组,该数组包含了一个 C字符串,且足够容纳追加后的字符串指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。

src----指向要追加的字符串。

返回值:

一个指向最终目标字符串的指针

使用:

int main()
{
	char a[20] = { "hollow" };
	char b[] = { "  world" };
	strcat(a,b);
	printf("%s", a);
}

结果:hollow  world

模拟实现:

char* my_strcat(char* a, const char* b)
{
	
    assert(a,b);
    char* p = a;
	while (*a !=  '\0');
	{
		a++;
	}
	while (*a++ =*b++);
	return p;
}

strcmp

声明:

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

 介绍:

比较两个字符串大小,这个大小不是字符串长度,而是从第一个字符开始比较ASCII值,若相同,则继续比较下一个字符,若不同,则终止比较。

 参数:

str1----进行比较的第一个字符串

str2---进行比较的第二个字符串

返回值:

str1 > str2 时返回大于0的数

str1 = str2 时返回0

str1 = str2 时返回小于0的数

使用:

int main()
{
	char a[4] = { "abc" };
	char b[4] = { "def" };
	int ret = strcmp(a, b);
	printf("%d", ret);
}

结果:-1

在vs2019编译器上,str1 >str2 时返回1,str1<str2时返回-1。但是时C标准,返回值并未规定为固定值。

模拟实现:

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

长度受限制的字符串操作函数

strncpy

声明:

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

 介绍:

相对于strcpy多了一个参数,‘size_t  n ’----代表所要拷贝的字节数把 src 所指向的字符串复制到 dest,最多复制 n 个字节的字符(末尾不会自动补 '\0' )。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。

参数:

  • dest -- 指向用于存储复制内容的目标数组。
  • src -- 要复制的字符串。
  • n -- 要从源中复制的字符数。

返回值:

返回类型为 char*,字符串指针,返回最终目标字符串dest的指针。

使用:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[30] = { "abcdefgh" };
	char b[] = { "xxx" };
	strncpy(a, b, 3);
	printf("%s", a);
}

编译结果:xxxdefgh

strncat

声明:

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

介绍:

把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 个字符长度为止(末尾会自动补 '\0' ),当src的长度小于n时,只会追加至 n 个字符截至。(注意与strncpy的不同)

参数:

  • dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
  • src -- 要追加的字符串。
  • n -- 要追加的最大字符数。

返回值:

指向最终目标字符串的指针。

使用:

int main()
{
	char a[30] = { "hollow " };
	char b[] = { "world" };
	strncat(a, b, 5);
	printf("%s", a);
}

编译结果:hollow world

字符串查找函数

strstr

声明:

char *strstr(const char *haystack, const char *needle)

 介绍:

在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

参数:

  • haystack -- 要被检索的 C 字符串。
  • needle -- 在 haystack 字符串内要搜索的小字符串。

 返回值:

返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

使用:

int main()
{
	char a[] = { "abcd" };
	char b[] = { "efg" };
	printf("%s",strstr(a, b));
}

编译结果:(null)

模拟实现:

char * my_strstr(char* p1,  char* p2)
{
	assert(p1 && p2);
	if (!*p2)
		return p1;
	char* s1 = p1;
	char* s2 = p2;
	char* cur = p1;
	while (*cur)
	{
		s1 = cur;
		s2 = p2;
		while (*s1 && *s2 && s1 == s2)
		{
			s1++;
			s2++;
		}
		if (!*s2 )
			return cur;
		if (!*s1)
			return NULL;
		cur++;
	}
	return NULL;
}

字符串分割函数

strtok:

声明:

char *strtok(char *str, const char *delim)

介绍:

 以某些分隔符为分割点,将字符串分割为多段。

参数:

str--要被分割的字符串

delim--存放分割符的字符串

返回值:

该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。当返回第一个被分解的第一个字符串后,会将分割符化为  '\0'  ,若想继续分割该段字符串,再次调用该函数,并将第一个参数改为空指针。

使用:

int main()
{
	char a[] = { "342.452*531+.345" };
	char b[] = { ".*+" };
	for (char* p = strtok(a, b); p != NULL; p = strtok(NULL, b))
	{
		printf("%s\n", p);
	}
}

编译结果:

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值