字符函数和字符串函数

发布于:2024-10-15 ⋅ 阅读:(174) ⋅ 点赞:(0)

目录

1. 字符分类函数

1.1写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变

1.2 toupper 和 tolower

2. strlen 的使⽤和模拟实现

方法1 计数器

 方法2 指针-指针

方法3 递归


3. strcpy 的使⽤和模拟实现

strcpy 的实现

 4. strcat 的使⽤和模拟实现

  stract的实现

 5 strcmp 的使⽤和模拟实现

strcmp的实现

6. strncpy 函数的使⽤

7. strncat 函数的使⽤

8 . strncmp函数的使⽤

 9. strtok 函数的使⽤

1. 字符分类函数

        C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是  ctype.h

        这些函数可以也用来判断返回值

         islower 是能够判断参数部分的 c 是否是⼩写字⺟的。

下面写一个练习

1.1写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变

        在这里就可以使 islower 来判断 ,代码就可以如下:

#include<stdio.h>
#include <ctype.h>
int main()
{
	char arr[] = "I am a student.";
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))//注 islower的头文件是 <ctype.h>
		{
			arr[i] -= 32;//如果进到这里的话就是小写字母, 小写字母- 32 =大写字母
		}
		i++;
	}
	printf(" %s ", arr);
	return 0;
}

        这样的话就完成了,

        1.2 toupper 和 tolower

         下面给大家介绍两个小写转大写字符,大写转 小写字符

#include <stdio.h>
#include <ctype.h>
int main()
{
	char ch = toupper('e');// 小写字符转为大写字符 头文件也是<ctype.h>
	printf("%c\n", ch);
	char c = tolower('E');//大写字符转换成小写字符,字符串不可以转换
	printf("%c\n", c);

		return 0;

         toupper  是小写字符转换为大写字符。

        tolower   是大写字符转换成小写字符

        字符串不可行,别问我为什么知道。

         那么例题1就可以优化了,

#include<stdio.h>
#include <ctype.h>
int main()
{
	char arr[] = "I am a student.";
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))//注 islower的头文件是 <ctype.h>
		{
			arr[i]=toupper(arr[i]);
		}
		i++;
	}
	printf(" %s ", arr);
	return 0;
}

2. strlen 的使⽤和模拟实现

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

        • 参数指向的字符串必须要以 '\0' 结束。

        • 注意函数的返回值为 size_t,是⽆符号的( 易错 )

        • strlen的使⽤需要包含头⽂件

#incldue <stdio.h>
#include <string.h>
int main()
{
	if (strlen("abc") - strlen("abcde")>0)//大家认为第一个strlen里面三个字符减去第二个strlen里面6个字符等于-3 ,
		//所以就选了=<  其实不是的,因为strlen的返回值是size_t 它是无符号整形,因为-3的补码如果是3他的补码很大的
	{
		printf("> ");
	}
	else
	{
		printf("=< ");
	}


	return 0;
}

         前面学过的strlen的实现,忘记了的可以在回归也一下

方法1 计数器

#include <stdio.h>
#include <assert.h>
int  my_strlen( const char * arr)
{
	int count = 0;
	assert(arr != NULL);

	while (*arr != '\0')
	{
		count++;
		arr++;
	}
	return count;
 }
int  main()
{
	char arr[] = "abcd";
	size_t len = my_strlen(arr);
	printf("%zd ", len);
	return 0;
}

 方法2 指针-指针

         这两种方法都是前面讲到的        

#include <stdio.h>
#include <assert.h>
int  my_strlen(const char* arr)
{
	const char* start = arr;
	assert(start != NULL);
	while (*start != '\0')
	{
		start++;
	}
	return  start-arr;
}
int  main()
{
	char arr[] = "abcd";
	size_t len = my_strlen(arr);
	printf("%zd ", len);
	return 0;
}

        下面还有第三种方法:

        方法3 递归

        大家先看这张图,再去理解下面的代码,

#include <stdio.h>
int  my_strlen(const char* arr)
{
	if (*arr != '\0')
		return 1 + my_strlen(arr + 1);//第一个不是0 最少就打印一位也就是 a ,
	//然后在调用 如何找到b 就是首个元素+1 --> arr+1 这样直到找到 \0 
	else//如果第一位为0 就返回0
		return 0;
}

int  main()
{
	char arr[] = "abcd";
	size_t len = my_strlen(arr);
	printf("%zd ", len);
	return 0;
}

3. strcpy 的使⽤和模拟实现

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

         源字符串必须以 '\0' 结束,没有\ 0 strcpy无法结束。

        • 会将源字符串中的 '\0' 拷⻉到⽬标空间。

        • ⽬标空间必须⾜够⼤,以确保能存放源字符串。

        • ⽬标空间必须可修改。

#include <stdio.h>

#include <string.h>
int main()
{
    char arr1[20] = {0};
    char arr2[] = "ao li gei !";
    strcpy(arr1, arr2);
    printf("%s ", arr2);

    return 0;
}

                                        

        这样就将源头字符串 arr 2拷贝到到了目的字符串 arr 1

         打开调试可以清楚的看见

         这里真的变成了 \0 

strcpy 的实现

        strcpy实现大概思路是 将arr1 的内容赋值给arr2 的内容

#incldue<stdio.h>
#include <string.h>
#include <assert.h>
void my_strcpy(char* dest, const char* src)//const char*src 来限制src的不能被修改
{
	assert(dest && src);

        while (*src != '\0')
	{
		*dest = *src; //将src的内容放置到dest空内容里
		dest++;
		src++;
	}
	*dest = *src;//来到这里说明 src不满足 while循环也就是等于 \0 的时候
}

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

         当然代码也可以优化。


#include  <stdio.h>
#include <string.h>
#include <assert.h>
void my_strcpy(char* dest, const char* src)//const char*src 来限制src的不能被修改
{
	assert(dest && src);
	while (*dest++ = *src++)//拷贝过去后的字符串,判断表达式,当拷贝到 \ 0 的时候,跳出循环
	{
		;
	}
	*dest = *src;//来到这里说明 src不满足 while循环也就是等于 \0 的时候
}

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

 4. strcat 的使⽤和模拟实现

        源字符串必须以 '\0' 结束。

        • ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

        • ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

        • ⽬标空间必须可修改。

        • 字符串⾃⼰给⾃⼰追加,如何?不保障

        这个代码是strcat的用法,将一个字符串拼接到另一个字符串

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[30] = "hello ";//这里要保证字符串能放下,尽量写的大写,否者就会报错
	char arr2[10] = "world";
	strcat(arr1, arr2);
	printf("%s ", arr1);

	return 0;
}

  stract的实现

        第一部先把dest存储到ret'中 ,找到目标字符串的 \ 0,   再将源字符串拷贝到目的字符串 

#incldue <stdio.h>
#include <assert.h>
char my_stract(char* dest, const char* src)
{
	//1 .找到目标空间的 \0
	char* ret = dest;
	assert(dest && src);
	while (*dest != '\0')
		dest++;
	//2.把原字符串拷贝到目标字符串上
	while (*dest++ = *src++)
		;
return ret;
 }
int main()
{
	char arr1[30] = "hello ";
	char arr2[10] = "world";
	my_stract(arr1,arr2);
	printf("%s ", arr1);
	return 0;
}

 5 strcmp 的使⽤和模拟实现

         第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦

        第⼀个字符串等于第⼆个字符串,则返回0 ◦

        第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字 ◦

        那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

        strcmp的实现

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2 != NULL);
	while (arr1 == arr2)//当arr1 和arr2 相等的时候向后找,
	{
		if (arr1== '\0')//进到这里说明是arr1和arr2 相等, 所以其中一个等于 \0就返回 0
		{
			return 0;
		}
		arr1++;
		arr2++;
	}
	return  arr1 - arr2;// 如果arr1 大于arr2 返回大于0 的数,如果arr1 小于arr2 返回小于零的数
 }
int main()
{
	char arr1[10] = "abcde";// 这里arr1小于arr2 返回小于0 的数
	char arr2[10] = "abcf";
	 int ret =	my_strcmp(arr1, arr2);
	 printf("%d ", ret);

	return 0;

         返回了小于0 的数

6. strncpy 函数的使⽤

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

        拷⻉num个字符从源字符串到⽬标空间。

        • 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "abcd";
	char arr2[20] = "xxxxx";
	strncpy(arr1, arr2, 3);
	printf("%s ", arr1);
	return 0;
}

 

7. strncat 函数的使⽤

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

        Appends the first num characters of source to destination, plus a terminating null-character. (将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符)。

        • If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.(如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾)。

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "abcd";
	char arr2[20] = "efght";
	strncat(arr1, arr2, 3);
	printf("%s ", arr1);
	return 0;
}

          和strcat 相似,就是多加了限制条件

8 . strncmp函数的使⽤

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

        ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.

代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "abcd";
	char arr2[20] = "abcf";
	 int ret =	strncmp(arr1, arr2, 4);
	 printf("%d ", ret);//前面比后面小就返回小于0 的数
	return 0;
}

 9. strtok 函数的使⽤

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

        sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合 • 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标 记。

• strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串⼀般都是临时拷⻉的内容并且 可修改。)

        • strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串 中的位置。

• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标 记。

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

代码如下:

#incldue <stdio,h>
#include <string.h>
int main()
{
	char arr[] = "zhengpengwei@qq.com";
	char buf[200] = { 0 };
	strcpy(buf, arr);//拷贝一份临时的字符串来切割
	char* set = "@.";//分割的符号
	char* ret = NULL;
	for (ret =strtok(buf, set); ret  != NULL; ret =strtok(NULL, set))//第一次传完 buf后
//面可以使用NULL ,因为这次的NULL自动存储了上一次的buf ,
	{
		printf("%s \n", ret);

	}
	return  0;
}

 完结 今天又是写了一天


网站公告

今日签到

点亮在社区的每一天
去签到