字符串和内存函数(2)

2.字符函数和字符串函数

2.1函数介绍

  • 自己给自己追加时,不可用strcat函数

2.1.4strcmp

用来比较字符串,比较两个字符串大小

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


int main()
{
	char arr1[] = "abq";
	char arr2[] = "abcdef";//比较对应字符的ASC11值
	//VS环境下:
	//> 1 
	//= 0 
	//< -1
	//若是“ab”“abcdef”则为-1
	int ret = my_strcmp(arr1, arr2);

	if (ret>0)//写==1不保险,即使是库函数也不可掉以轻心
		printf("arr1>arr2\n");

	printf("%d\n", ret);

	return 0;
}

比较的不是字符串长度,而是对应字符串的内容
strcpy
strcat
strcmp
均为长度不受限制的字符串函数,均到\0为止。

但函数不安全
长度受限制字符串函数:
strncpy(,n)
strncat(,n)
strncmp(,n)

2.1.5strncpy

  1. 拷贝num个字符从原字符串到目标空间
  2. 如果源字符串的长度小于num,则拷贝完源字符串后,在目标后面追加0,直到num个
    char*strncpy(char*destination,const char *source,size_t num);
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxx";
	strncpy(arr1, "abcdef", 10);
	printf("%s\n", arr1);
	return 0;
}

输出abcdef0000xxxx

2.1.6strncat

char*strncat(char*destination,const char*  source , size_t num);

追加字符到一个字符串中去

int main()
{
	char arr1[20] = "abc\0xxxxxxxx";
	strncat(arr1, "defqwer", 4);
	printf("%s\n", arr1);

	return 0;
}

输出abcdefq

2.1.7strncmp

int strncmp(const char*str1,coonst char *str2,size_t num);

比较n个字符

int main()
{
	char* p1 = "abcdef";
	char* p2 = "abcqwer";
	int ret = strncmp(p1, p2, 4);//比较4个
	printf("%d\n", ret);
	return 0;
}

输出-1

2.1.8strstr strtok 字符串查找函数

strstr

const char * strstr(const*str1,const char *str2);

在str1中找str2,str2在str1中第一次出现的位置,如果找到了就返回第一次出现的位置,如果找不到返回空指针

int main()
{
	char arr1[] = "abbbcdbbcef";
	char arr2[] = "bbc";
	char* ret = my_strstr(arr1, arr2);//返回bbc中b的地址

	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);//输出bbcef
	}

	return 0;
}

情况一:一次即可匹配成功
abcdef //需对b进行保存
bc
情况二:多次匹配
abbbbcdef 委托两个指针让他们往后走,一次匹配不成功时,str还能回到第一个位置中来
bbc
charcp:记录当前指针从哪开始匹配
char
s1:让指针围绕str1往后走
char*s2:让指针围绕str2往后走

//暴力匹配
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')
	{
		return (char*)str1;//将const char*强制类型转化为char*
	}
	const char* s1 = NULL;//没有初始化,只给了两个空指针
	const char* s2 = NULL;
	const char* cp = str1;//cp一定要初始化,记录起始位置

	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 !='\0' && *s2!='\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cp;
		}
		cp++;
	}

	return NULL;
}

//KMP算法也是用来字符串匹配的

2.1.9strtok

char * strtok(char*str,const char*sep);
  • sep参数是个字符串,定义了用作分隔符的字符的集合
  • 第一个参数指定一个字符串,它包含了0个或多个由sep字符串中一个或多个分隔符分割的标记
  • strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注意:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改)
  • strtok函数的第一个参数不为NULL,函数找到str中第一个标记,strtok函数将保存他在字符串中的位置
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
  • 如果字符串中不存在更多的标记,则返回NULL指针
int main()
{
	//char arr[] = "[email protected]";//"@."分隔符
	char arr[] = "192#168.120.85";
	char* p = "#.";//p指向的分隔符
	char buf[20] = { 0 };//"zpengwei\0yeah\0net"
	strcpy(buf, arr);
	char* ret = NULL;
	for (ret = strtok(buf, p); ret != NULL; ret=strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	
	//char* ret = strtok(buf, p);
	//printf("%s\n", ret);
	//ret = strtok(NULL, p);
	//printf("%s\n", ret);
	//ret = strtok(NULL, p);
	//printf("%s\n", ret);

	//zpengwei
	//yeah
	//net
	return 0;
}

\0不能当分隔符

你可能感兴趣的:(c语言,学习)