字符函数和字符串函数

目录

1. 字符分类函数

2. 字符转换函数

3. strlen的使用和模拟实现

4. strcpy的使用和模拟实现

5. strcat的使用和模拟实现

6. strcmp的使用和模拟实现

7. strncpy函数的使用

8. strncat函数的使用

9. strncmp函数的使用

10. strstr的使用和模拟实现

11. strtok函数的使用

12. strerror函数的使用


1. 字符分类函数

 C语言中有一系列的函数是专门进行字符分类的,也就是,一个字符是属于什么类型的字符。

这些函数的使用都需要包含一个头文件 

函数 如果其参数符合下列条件就返真
iscntrl 任何控制字符
isspace 空白字符:空格,换行'\n',换页'\f',回车'\r',制表符'\t',垂直制表符'\v'
isdigit 十进制数字字符 '0' ~ '9'

isxdigit

十六进制数字
islower 小写字母a ~ z
isupper 大写字母A ~ Z
isalpha 字母
isalnum 字母或者数字
ispunct 标点符号,任何不属于数字或者字母的图形字符
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

//例子
int islower (int c);

 例题:写一个代码,将字符串中的大写写字母转换成小写,其他不变。

字符函数和字符串函数_第1张图片

2. 字符转换函数

 C语言提供了2个字符转换函数:

int tolower (int c);//将参数传进去的大写字母转小写
int toupper (int c);//将参数传进去的小写字母转大写

字符函数和字符串函数_第2张图片

3. strlen的使用和模拟实现

 strlen

size_t strlen ( const char * str );

(1)字符串以 '\0' 作为结束的标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' );

(2)参数指向的字符串必须要以 '\0' 结束

(3)注意函数的返回值为size_t,是无符号的;

(4)strlen的使用需要包含头文件;

strlen的模拟实现:字符函数和字符串函数_第3张图片

方法2:

size_t my_strlen2(const char* str)
{
	assert(str);
	const char* start = str;
	while (*str)
	{
		str++;
	}
	return str - start;
}

 方法3:

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

4. strcpy的使用和模拟实现

strcpy - string copy 字符串拷贝

char * strcpy ( char * destination, const char * source );

字符函数和字符串函数_第4张图片

 注意:strcpy在拷贝的时候是有将 '\0' 拷贝过来的。

 字符函数和字符串函数_第5张图片字符函数和字符串函数_第6张图片

(1)源字符串必须以 '\0' 结束;

(2)会将源字符串中的 '\0' 拷贝到目标空间;

(3)目标空间必须足够大,以确保能存放源字符串;

(4)目标空间必须可修改。

 模拟strcpy的实现

#include 
#include 

my_strcpy(char* dest, char* src)
{
	while (*src != '\0')
	{
		*dest++ = *src++;
	}
	*dest = *src;
}

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

5. strcat的使用和模拟实现

strcat - concatenate strings 追加字符

char * strcat ( char * destination, const char * source );

(1)源字符串必须以 '\0' 结束;

(2)目标字符串也得有 \0,否则没办法知道从哪追加;

(3)目标空间必须有足够的大,能容纳下源字符串得到内容;

(4)目标空间必须可修改。

字符函数和字符串函数_第7张图片

模拟实现strcat函数:

#include 
#include 
#include 

my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//1.找到目标空间的 \0
	while (*dest)
	{
		dest++;
	}
	//2.拷贝
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}

6. strcmp的使用和模拟实现

strcmp - compare two strings 比较两个字符串(比较的是对应位置上的字符大小,小的字符所在的字符串,小于另一个字符串)

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

字符函数和字符串函数_第8张图片 字符函数和字符串函数_第9张图片

strcmp的模拟实现:

#include 
#include 

int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	if (*s1 > *s2)
		return 1;
	else
		return -1;
}

int main()
{
	int ret = my_strcmp("abcdef", "abc");
	if (ret > 0)
		printf("大于\n");
	else if (ret == 0)
		printf("等于\n");
	else
		printf("小于\n");
	return 0;
}
#include 
#include 

int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	return *s1 - *s2;
}

int main()
{
	int ret = my_strcmp("abcdef", "abc");
	if (ret > 0)
		printf("大于\n");
	else if (ret == 0)
		printf("等于\n");
	else
		printf("小于\n");
	return 0;
}

上面的strcpy,strcat,strcmp都是长度不受限制的字符串函数,是不安全的。

下面的strncpy,strncat,strncmp都是长度受限制的字符串函数。

7. strncpy函数的使用

strncpy - copy characters from string

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

字符函数和字符串函数_第10张图片

(1)拷贝num个字符从源字符串到目标空间;

(2)如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到有num个。 

8. strncat函数的使用

strncat - append characters from string

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

(1)将src指向字符串的前num个字符追加到dest指向的字符串末尾,再追加一个 '\0' 字符;

(2) 如果src指向的字符串的长度小于num时,只会讲字符串中到 '\0' 的内容追加到dest指向的字符串末尾。

9. strncmp函数的使用

strncmp - compare characters of two strings

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

 比较str1和str2两个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样,就提前结束,大的在字符所在的字符串大于另外一个。字符函数和字符串函数_第11张图片

10. strstr的使用和模拟实现

 strstr - locate substring 查找子字符串

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

(1)函数返回字符串str2在字符串str1中第一次出现的位置;

(2)字符串的比较匹配不包含 \0 字符,以 '\0' 作为结束标志。

字符函数和字符串函数_第12张图片 strstr的模拟实现

#include 
#include 
#include 

char* my_strstr(const char* str1, const char* str2)
{
	const char* cur = str1;
	const char* s1 = NULL;
	const char* s2 = NULL;

	assert(str1 && str2);
	if (*str2 == '\0')
	{
		return (char*)str1;
	}

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

int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbq";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");

	return 0;
}

11. strtok函数的使用

strtok - split string into tokens 将字符串拆分为标记

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

(1)sep参数指向一个字符串,定义了用作分隔符的字符集合;

(2)第一个参数指定了一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分割符分割的标记;

(3)strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。

(4)strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串中的位置;

(5)strtok函数中的第一个参数为NULL,函数在同一个字符串中被保存的位置开始,查找下一标记;

(6)如果字符串中不存在更多的标记,则返回NULL指针。

#include 
#include 

int main()
{
	char arr[] = "193.168.6.111";
	char* sep = ".";
	char* str = NULL;
	for(str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s\n", str);
	}
	return 0;
}

12. strerror函数的使用

 strerror - get pointer to error message string 

char * strerror ( int errnum );

strerror函数可以将参数部分错误码对应的错误信息的字符串地址返回来。

字符函数和字符串函数_第13张图片

你可能感兴趣的:(c语言,算法)