C语言课堂知识小结(5)——字符串函数

本文详细介绍了C/C++中的strlen、strcpy、strcmp、strcat、strstr、strtok和strerror等关键字符串处理函数的用法、实现和应用场景,帮助读者掌握字符串操作的基础技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、strlen函数。

2、strcpy函数。

3、strcmp函数

4、strcat函数

5、strstr函数

6、strtok函数

7、strerror


1、strlen函数。

strlen函数是一个库函数,功能是计算字符串的长度。

size_t strlen(const char* string);

函数的参数是字符型指针,返回值是size_t类型,也就是无符号整型。

strlen是以字符'\0'作为结束标志,返回的值是'\0'前面的字符个数。

模拟实现函数strlen。

1、正常实现。

当数组元素的首地址传到my_strlen 函数中,my_strlen函数需要通过该地址向后找到字符'\0'并统计'\0'之前的元素个数(不包括\0)。

int my_strlen(const char* str)
{
   assert(str!=NULL);
   int count=0;
  while(*str!='\0')
  {
     str++;
     count++;
   }
  return count;
}

2、指针相减

指针减去指针得到的结果是两个地址之间的元素个数。

int my_strlen(const char* str)
{
   assert(str!=NULL);
   char* ret=str;  //记着元素的首地址
  while(*str!='\0')
  {
     str++;
    
   }
  return str-ret;
}

3、递归

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

 为了增加函数的鲁棒性,还需要断言指针,排除空指针的可能。


2、strcpy函数。

功能是将字符串2拷贝到字符串1中。

char * strcpy(const char* strDestination,const char*strSource);

源字符串必须以'\0'结束,该函数会将源字符串中的\0拷贝到目标字符串中。

该函数使用时,要确保目标字符串足够大,确保字符串可以完整拷贝。

目标字符串是可以被改变的,常量字符串是不能被改变的。

函数的返回值是目标字符串的首地址。

模拟实现strcpy.

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


3、strcmp函数

字符串比较函数。功能:比较字符串的大小,但比较的不是字符串的长短。

strcmp函数比较的不是字符串的长度,而是比较字符串中对应位置上字符的大小,如果相同,就比较下一对,直到不同或者都遇到\0.

是按字符的ASCII码值比较的。

函数有三个返回值,若两个字符串相等,则返回0;若字符串1>字符串2,则返回一个大于零的数,若字符串1<字符串2,则返回一个小于零的数。返回的数有不确定性,如果在VS2019环境下,返回的是1 0 -1 ,在其他环境则不确定。

模拟实现strcmp函数

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

4、strcat函数

  字符串追加函数。从目标函数的'\0'处开始,向后追加字符串2,直到字符串的\0位置处。

使用时要确保字符串1空间足够大,能够放下字符串2.

函数的返回值是字符串1的首地址

模拟实现strcat

char* my_strcat(char* str1,const char* str2)
{
   assert(str1&&str2);
  char* ret=str1;
   while(*str1)  //先找目标字符串的\0地址
   {
  str1++;
   }
  while(*str1++=*str2++)
   {
     ;
    }

    return ret;
}

5、strstr函数

char *strstr( const char *string, const char *strCharSet );

找字符串中的子字符串。

返回值是子字符串的地址。

模拟实现strstr函数。

char *strstr( const char *str1, const char *str2 )
{
  char* s1=str1;
  char* s2=str2;
  char* cur=str1;
while(*cur)  //走到str1的最后
{ 
    s1=cur;
   s2=str2;
   while(*s1&&*s2&&(*s1==*s2))
   {
     s1++;
     s2++;
   }
 if(*s2==0)
  return (char*)cur;
   cur++;
}

return  NULL;
}


6、strtok函数

字符串切割函数。

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

sep是定义字符串分割符的集合 。

用法如下:

int main()
{
	char arr[] = "zhangbq@qq.com";
	char buf[30] = { 0 };
	strcpy(buf, arr);//保留arr的数据
	const char* sep = "@.";
	char* str = NULL;
	for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep)) // 妙
	{
		printf("%s\n", str);
	}
	//printf("%s\n",strtok(buf, sep));//只找第一个标记 @ zhangbq
	//printf("%s\n", strtok(NULL, sep));//从保存好的位置开始继续往后找 . qq
	//strtok(NULL, sep);//从保存好的位置开始继续往后找 \0 com
	return 0;
	}

 


7、strerror

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

char*  strerror(int errnum)

errno 全局变量错误码

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%s\n", strerror(i));
	}
	/*int *p=(int*)malloc(40);  //向堆区申请内存的,返回申请空间的起始地址
	if (p == NULL)
	{
		///printf("%s\n", strerror(errno));
		perror("malloc");//自己会打印
		return 1;
	}*/
	return 0;
}

错误码0-9对应的错误信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开拓的嚣张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值