字符函数与字符串函数

本文详细介绍了C语言中的字符函数如isdigit、islower、tolower和toupper,以及字符串处理函数如strlen、strcpy、strcat、strcmp、strncat、strncmp和strstr。文章还提供了这些函数的使用示例和作者自定义的模拟实现方法。
摘要由CSDN通过智能技术生成

前言

本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看

1字符函数

在讲解字符函数时,大家得了解什么是字符吧

普通字符'a' ' b'  'c'  '1'  ' @'  转义字符' \n '  换行‘ \t’  水平制表符'\r'回车

大家了解即可

在C语言中字符也可以有分类

所以我们先来看看字符分类函数

1.1字符分类函数

大家看以上函数的参数返回值以及它的功能几乎一致

我们这里以这个函数为例

int isdigit ( int c );

isdigital 是能够判断参数部分的 c 是否是字符‘0’--‘9’的

代码

#include <stdio.h>
#include <ctype.h>
int main ()
{
  char str[]="1776ad";
  int size=sizeof(str)/sizeof(str[0]);
  while(size)
  {
    if(isdigit(str[0]))
    printf("该字符为数字字符%c\n",str[0]);
    size--;
  }
  return 0;
}

该代码能够把一个字符串中的数字字符找到

看看返回值

A value different from zero (i.e., true) if indeed c is a decimal digit. Zero (i.e., false) otherwise.

如果c确实是十进制数字,则为与零不同的值(即true)。否则为零(即false)

再举一个例子

int islower ( int c );

看代码

#include <stdio.h>
#include <ctype.h>
int main ()
{
 int i = 0;
 char str[] = "Test String.\n";
 char c;
 while (str[i])
 {
 c = str[i];
 if (islower(c)) 
 c -= 32;
 putchar(c);
 i++;
 }
 return 0;
}

该代码的作用是将字符串中的⼩写字⺟转⼤写,其他字符不变

当然咱么是个细节的人,看看返回值

 value different from zero (i.e., true) if indeed c is a lowercase alphabetic letter. Zero (i.e., false) otherwise.

如果c确实是小写字母,则值与零不同(即true)。否则为零(即false)

上面的每一个函数的表达式几乎一样,这里不再赘述,注意还是要看看返回值的含义

而且,发现了没有参数是int但是功能却是判断字符串

主要是中间其实发生了类型转换,本身int类型是大于char类型的

1.2字符转换函数

我们在这里讲解两个

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写

int toupper ( int c );//将参数传进去的⼩写字⺟转⼤写

值得注意的是,他是完全可以有我们自主实现的

那么,我们可以模拟实现该函数

当然我们上一个代码其实就是它的模拟实现

所以,我们只是举一个例子就好

#include<ctype.h>
#include<stdio.h>
int main()
{
char a[]="jdkalkdkjakldkj\n";
int i=0;
while(a[i])
{
toupper(a[i]);
puchar(a[i])
i++;
}
return 0;
}

这个代码就是把小写字母变为大写字母

2字符串函数

2.1 strlen 的使⽤和模拟实现

定义

size_t strlen ( const char * str );

作用计算字符串的长度

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

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

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

strlen的使⽤需要包含头⽂件

1strlen的使用

看代码

#include<string.h>
#include<stdio.h>
int main()
{

char a[]=“jdlkalkdjkllkakldjkl”;
strlen(a);
return 0;
}

其实这个代码就是计算了字符串的长度

2模拟实现

分析 首先strlen函数得要接收一个地址类型是char *

返回一个无符号的数代表该字符串的长度

代码1实现

size_t My_strlen(const char* dest)
{
	assert(dest);
	int count = 0;
	while (*dest++)//当* dest为\0时 它的ASCLL码值为0
	{
		count++;
	}
	return count;
}
int main()
{
	char a[] = "jkaldkljda";
	printf("%zd\n", My_strlen(a));
	printf("%zd\n", strlen(a));
	return 0;
}

看结果

代码2实现

size_t My_strlen(const char* dest)
{
	assert(dest);
	char* p1 = (char *)dest;
	while (*dest++);//当* dest为\0时 它的ASCLL码值为0
	return dest-p1-1;
}
int main()
{
	char a[] = "jkaldkljdadakjkjlaksc";
	printf("%zd\n", My_strlen(a));
	printf("%zd\n", strlen(a));
	return 0;
}

其实就是把最后结果变为 指针-指针

但是由于*dest为‘\n’时有后置加加所以要多减去一个1

结果是一样的

2.2strcpy 的使⽤和模拟实现

• Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).

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

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

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

• ⽬标空间必须可修改

上面同样是注意事项

1strcpy的使用

int main()
{
	char a[10] = "djklak";
	char b[20] = { 0 };
	strcpy(b, a);
	printf("%s", b);
	return 0;
}

2strcpy的模拟实现

char *strcpy( char *strDestination, const char *strSource );

返回值为目的地址

看代码

char *My_strcpy(char *dest,const char *src)
{
	assert(dest && src);
	char* p1 = dest;
	while (*dest++ = *src++);
	return p1;
}

看结果

3.3.strcat 的使⽤和模拟实现

• Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.

源字符串必须以 '\0' 结束 ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

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

⽬标空间必须可修改。

1strcat的使用

看代码

int main()
{
	char a[20] = "hello";
	char b[10] = " world";
	strcat(a, b);
	printf("%s\n", a);
	return 0;
}

2strcat的模拟实现

char *strcat( char *strDestination, const char *strSource );

char* My_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while (*(++dest));
	while (*dest++ = *src++);
	return ret;
}
int main()
{
	char a[20] = "hello";
	char b[10] = " world";
	char c[20] = "hello";
	My_strcat(a, b);
	strcat(c, b);
	printf("%s\n", a);
	printf("%s\n", c);
	return 0;
}

看结果

3.4strcmp 的使⽤和模拟实现

• This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.

•标准规定:第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦ 第⼀个字符串等于第⼆个字符串,则返回0 

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

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

1strcmp的使用

int main()
{
	char* a = "jdkajkd";
	char* b = "djajdascdad";
	int flag = strcmp(a, b);
	if (flag > 0)
		printf("第一个字符串大\n");
	else if (flag == 0)
		printf("两个一样大\n");
	else
		printf("第二个字符串的\n");
	return 0;
}

2strcmp的模拟实现

int strcmp( const char *string1, const char *string2 );

int My_strcmp(const char* string1,const char *string2)
{
	assert(string1 && string2);
	while (*string1 && *string2)
	{
		if (*string1 == *string2)
		{
			string1++; string2++;
		}
		else
			break;
	}
	return *string1 - *string2;
}
int main()
{
	char* a = "jdkajkd";
	char* b = "djajdascdad";
	int flag1=strcmp(a, b);
	int flag2 = My_strcmp(a, b);
	if (flag1*flag2>=0)
		printf("模拟成功\n");
	if (flag1 > 0)
		printf("第一个字符串大\n");
	else if (flag1== 0)
		printf("两个一样大\n");
	else
		printf("第二个字符串大\n");
	return 0;
}

看结果

3.5strncat 的使⽤和模拟实现

strncat就是多了个参数,限定copy的字符串大小

将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符

如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾

1strncat的使用

#include <stdio.h>
#include <string.h>
int main ()
{
 char str1[20];
 char str2[20];
 strcpy (str1,"To be ");
 strcpy (str2,"or not to be");
 strncat (str1, str2, 6);
 printf("%s\n", str1);
 return 0;
}

2strncat的模拟实现

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

char *My_strncat(char *dest,const char *src,size_t n)
{
	char* ret = dest;
	assert(dest && src);
	while (*(++dest));
	while (n--&&*src)
	*dest++ = *src++;
	*dest = '\0';
	return ret;
}
int main()
{
	char str1[20];
	char str2[20];
	char str3[20];
	strcpy(str1, "To be ");
	strcpy(str2, "or not to be");
	strcpy(str3, "To be ");
	My_strncat(str1, str2, 6);
	strncat(str3, str2, 6);
	printf("%s\n", str1);
	printf("%s\n", str3);
	return 0;
}

看结果

3.6strncmp的使⽤和模拟实现

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

1strncmp的使用

#include <stdio.h>
#include <string.h>
int main ()
{
 char *p1="abcde";
 char *p2="abcfe";
 int a=strncmp(p1,p2,3);
if(a>0)
printf("第一个字符串在前3个字符中更大\n");
else if(a=0)
printf("两个字符串在前3个字符中一样大\n");
else
printf("第二个字符串在前3个字符中更大\n");
 return 0;
} 

2strncmp模拟实现

int My_strncmp(const char* str1, const char* str2,size_t n)
{
	assert(str1 && str2);
	while (n--&& *str1 && *str2)
	{
		if (*str1 == *str2)
		{
			str1++; str2++;
		}
	}
	return *str1 - *str2;
}
int main()
{
	char* p1 = "abcde";
	char* p2 = "abcfe";
	int a = strncmp(p1, p2, 3);
	int b = My_strncmp(p1, p2, 3);
	if (a * b >= 0)
		printf("模拟成功\n");
	if (a > 0)
		printf("第一个字符串在前3个字符中更大\n");
	else if (a==0)
		printf("两个字符串在前3个字符中一样大\n");
	else
		printf("第二个字符串在前3个字符中更大\n");
	return 0;
}

看结果

3.7strstr 的使⽤和模拟实现

1strstr的使用

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

函数返回字符串str2在字符串str1中第⼀次出现的位置

字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志

#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] ="This is a simple string";
 char * pch;
 pch = strstr (str,"simple");
 strncpy (pch,"sample",6);
 printf("%s\n", str);
 return 0;
} 

2strstr模拟实现

int main()
{
	char *p=strstr("abcdefg","cd");
	printf("%s", p);
	return 0;
}
//2模拟实现一下
char* My_strstr(const char* p1, const char* p2)
{
	const char* cur=p1;
	const char* p3=p2;
	while (*cur)
	{
		cur = p1;
		p3 = p2;
		while ((*p3&&*cur)&&*cur++==*p3++)
		if (!*p3)
			return (char*)p1;
		if (*cur)
			p1++;
		else
			return NULL;
	}
	return NULL;
}

看结果

总结

这几个字符串函数的模拟实现花了不少时间才手打完

ok祝大家开心

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值