当前位置:首页 » 《随便一记》 » 正文

常用的字符串函数详解_old_old_boy的博客

29 人参与  2021年12月28日 17:23  分类 : 《随便一记》  评论

点击全文阅读


字符串函数

  • strlen()
    • 介绍
    • 作用
    • 举例使用strlen()函数
    • 模拟实现strlen()函数
  • strcpy()
    • 介绍
    • 作用
    • 举例使用strcpy()函数
    • 模拟实现strcpy()函数
    • strcpy()函数注意事项
    • strncpy()函数
      • 介绍
      • 举例使用strncpy()函数
  • strcat()
    • 介绍
    • 作用
    • 举例使用strcat()函数
    • 模拟实现strcat()函数
    • strcat()函数注意事项
    • strncat()函数
      • 介绍
      • 举例使用strncat()函数
  • strcmp()
    • 介绍
    • 作用
    • 举例使用strcmp()函数
      • strncmp()函数
  • strstr()
    • 介绍
    • 作用
    • 举例使用strstr()函数
    • 模拟实现strstr()函数
  • strtok()
    • 介绍
    • 作用
    • 举例使用strtok()函数

  • 以下介绍的字符串函数都是在<string.h>的头文件下的

strlen()

介绍

  • 函数模型:size_t strlen( const char * string );
  • 参数:一个字符串
  • 返回值是size_t(unsigned int),无符号整数,因为字符串长度不可能是负数,因此返回值是一个无符号整数

作用

  • 求字符串的长度,并且在计数过程中遇到’\0’,就会停止计数,返回’\0’之前的字符个数

举例使用strlen()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str[] = "abcdefg";
	printf("%u", strlen(str));
	//因为strlen()函数返回的是无符号整数,因此最正确的写法是打印%u,%u是打印无符号整数,当然如果这里写成%d也可以
	return 0;
}

模拟实现strlen()函数

#include <stdio.h>

int my_strlen(const char* s)
{
	char* p = s;
	if (*p == '\0')//当遇到'\0'时,就停止计数
		return 0;
	return 1 + my_strlen(p + 1);
}
int main()
{
	char str[] = "abcdefg";
	int len = my_strlen(str);
	printf("%d\n", len);
	return 0;
}

strcpy()

介绍

  • 函数模型:char * strcpy( char * str1, const char * str2 );
  • 参数:目标字符串和被拷贝字符串

作用

  • 字符串拷贝,将字符串str2的内容拷贝到字符串str1中

举例使用strcpy()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[20];
	char str2[] = "abcdef";
	strcpy(str1, str2);//将字符串str2的内容拷贝到字符串str1中
	printf("%s", str1);
	return 0;
}

模拟实现strcpy()函数

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* str)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(str != NULL);
	while (*dest++ = *str++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "###############";
	char arr2[] = "bits";
	printf("%s\n", my_strcpy(arr1, arr2));
 	return 0;
}

strcpy()函数注意事项

  • strcpy()函数在使用时,目标字符串的空间必须足够大(比被拷贝的字符串空间大,因为strcpy是当遇到’\0’是才会停止拷贝),这样才能正常使用,如果空间太小,就无法使用,因此在有些编译器(比如VS)中会认为该函数不安全
  • 但是在C语言的库中,还有另一个字符串拷贝函数----strncpy(),相比于strcpy()函数更安全

strncpy()函数

介绍

  • 函数模型:char * strncpy( char * str1, const char * str2, size_t count );
  • 相比于strcpy()函数,strncpy()函数多了一个参数,该参数是用来限定拷贝的长度的

举例使用strncpy()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[20] = "################";
	char str2[] = "abcdef";
	strncpy(str1, str2, 2);
	printf("%s", str1);
	return 0;
}
  • 运行结果

在这里插入图片描述

strcat()

介绍

  • 函数模型:char * strcat( char * str1, const char * str2 );

作用

  • 将字符串str2追加到字符串str1后面

举例使用strcat()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[10] = "abcd";
	char str2[] = "efg";
	strcat(str1, str2);
	printf("%s", str1);
	return 0;
}
  • 运行结果
    在这里插入图片描述

模拟实现strcat()函数

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest,const char* src)
{
	assert(dest && src);
	char* p = dest;
	//找到'\0'
	while (*++dest)
	{
		;
	}
	//开始追加
	while (*dest++ = *src++)
	{
		;
	}
	return p;
}

int main()
{
	char arr1[20] = "abcd";
	char arr2[] = "efg";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcat()函数注意事项

  • 与strcpy()函数一样,strcat()同样存在不安全的情况,当strcat()追加自己时,就无法完成
#include <stdio.h>
#include <string.h>

int main()
{
	char str1[10] = "abcd";
	char str2[] = "efg";
	strcat(str1, str1);
	printf("%s", str1);
	return 0;
}

上诉代码无法完成对自己的追加

  • 此时可以用strncat()函数

strncat()函数

介绍

  • 函数模型:char * strncat( char * str1, const char * str2, size_t count );
  • 相比于strcat()函数,多增加的参数是要追加的数量

举例使用strncat()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[10] = "abcd";
	strncat(str1, str1, 4);
	printf("%s", str1);
	return 0;
}

strcmp()

介绍

  • 函数模型:int strcmp( const char * string1, const char * string2 );

作用

  • 比较字符串大小内容(不是长度)(参考字典序)(ASCII值),若string1>string2,返回一个大于0的数,若string1=string2,返回0,若string1 < string2,返回小于0的数。

举例使用strcmp()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "abcd";
	char str2[] = "abce";
	int ret = strcmp(str1, str2);
	printf("%d", ret);
	return 0;
}

在这里插入图片描述

strncmp()函数

  • 同上面函数一样,比strcmp()函数多了一个参数,比较的个数
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "abcd";
	char str2[] = "abce";
	int ret = strncmp(str1, str2, 3);
	printf("%d", ret);
	return 0;
}

在这里插入图片描述

strstr()

介绍

  • 函数模型:char * strstr( const char * string, const char * strCharSet );

作用

  • 字符串查找函数,如果字符串strCharSet在字符串string中,返回第一次出现的位置的指针,若不在string中,则返回空指针

举例使用strstr()函数

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "dhafjkhsdabcdrewtertwert";
	char str2[] = "abc";
	char* ret = strstr(str1, str2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}
  • 运行结果
    在这里插入图片描述

模拟实现strstr()函数

#include <stdio.h>
#include <assert.h>

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	char* p1;
	char* p2;
	char* cp = str1;//记录可能成功的值
	while (*cp != '\0')
	{
		p1 = cp;
		p2 = str2;
		/*while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)*/
		while (*p1 && *p2 && *p1 == *p2)
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
			return cp;
		if (*p1 == '\0')
			return NULL;
		cp++;
	}
	return NULL;
}

int main()
{
	char arr1[] = "I am a good student, hehe";
	char arr2[] = "student";
	char* ret = my_strstr(arr1, arr2);
	printf("%s\n", ret);
	return 0;
}

strtok()

介绍

  • 函数模型:char * strtok( char * str, const char * strDelimit );
  • strDelimit是分隔符字符集

作用

  • strtok()是用来切割字符串的
  1. 第一个参数指定一个字符串,它包含了0个或多个由strDelimit字符串中一个或多个分隔符分割的标记。
  2. strtok函数找到str中的下一个标记,并将其用’\0’结尾,返回一个指向这个标记的指针(注:strtok函数会改变被操控的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)。
  3. strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串中的位置。
  4. strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

举例使用strtok()函数

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "15145j@qq.com";
	char arr2[100] = { 0 };
	strcpy(arr2, arr1);
	char sep[] = "@.";
	char* ret = NULL;
	for (ret = strtok(arr2, sep);ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}
	/*strtok(arr2, sep);
	strtok(NULL, sep);*/
	return 0;
}
  • 运行结果
    在这里插入图片描述

点击全文阅读


本文链接:http://zhangshiyu.com/post/32302.html

函数  字符串  举例  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1