常用的字符串函数详解

Posted old_old_boy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用的字符串函数详解相关的知识,希望对你有一定的参考价值。

  • 以下介绍的字符串函数都是在<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;
}
  • 运行结果

以上是关于常用的字符串函数详解的主要内容,如果未能解决你的问题,请参考以下文章

记录C#常用的代码片段

常用Javascript代码片段集锦

常用的字符串函数详解

nodejs常用代码片段

jQuery的DOM操作

Python学习入门教程,字符串函数扩充详解