字符函数和字符串函数(1)

文章目录

一、字符分类函数

二、字符转换函数

三、strlen的使用和模拟实现

四、strcpy的使用和模拟实现

五、strcat的使用和模拟实现

六、strcmp

七、strncpy,strncat,strncmp函数的使用

    7.1 strncpy函数的使用

    7.2 strncat函数的使用

    7.3strncmp函数的使用


一、字符分类函数 

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

  •  以 islower 函数为例子:

传递字符的ASCII码值,判断字母是否为小写,通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。

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

#include <stdio.h>
#include <ctype.h>


int main()
{
	char arr[] = "Wu wei qi Yue.";
	//            0123
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))
		{
			arr[i] -= 32;
		}
		i++;
	}

	printf("%s\n", arr);
	
	return 0;
}

(小写字母的ASCII - 32 = 对应的大写字母的ASCII)

二、字符转换函数

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

  1. int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
  2. int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
所以上述代码我们可以使用 这两个函数进行优化:
#include <stdio.h>
#include <ctype.h>


int main()
{
	char arr[] = "Wu wei qi Yue.";
	//            0123
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))
		{
			arr[i] = toupper(arr[i]);
		}
		i++;
	}

	printf("%s\n", arr);
	
	return 0;
}

三、strlen的使用和模拟实现

字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
'\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为 size_t,是⽆符号的( 易错 )
strlen的使⽤需要包含头⽂件
在指针的学习中我们对 strlen 的模拟实现使用了两种方法:
  1. 模拟计算器
  2. 指针 - 指针

下面我可以用第三种方法: 函数递归


#include<string.h>
#include<stdio.h>
#include<assert.h>

size_t my_strlen(const char* p)
{

	assert(p != NULL);
	if (*p != '\0')
	{
		return 1 + my_strlen(p+1);
	}
	else
	{
		return 0;
	}

}

int main()
{
	char arr[] = "xiaoxinshanguang";
	size_t len = my_strlen(arr);
	printf("%zd", len);

	return 0;
}

四、strcpy的使用和模拟实现

源字符(source)串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷⻉到⽬标空间。
⽬标空间(destination)必须⾜够⼤,以确保能存放源字符串。
⽬标空间(destination)必须可修改。
#include <string.h>
#include <assert.h>
#include <stdio.h>

char* my_strcpy( char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src != NULL);
	while (*dest = *src)
	{
		dest++;
		src++;
	}
	return ret;
}

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

	return 0;//返回目标空间的起始地址
}

五、strcat的使用和模拟实现

源字符串必须以 '\0' 结束。
⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改。

 (找到目标空间的末尾 \0 ,再将源字符串拷贝过来)

首先先了解一下 0:

  1.  \0:'\0' 表示 \ddd ,ddd表示 1~3个8进制数字, \0 的ASCII值是 0;
  2. 数字字符 0:数字字符 0 的ASCII值是48.
#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src != NULL);// '\0'
	while (*dest != '\0')//找到目标空间的 \0
	{
		dest++;
	}
	while (*dest = *src)
			{
				dest++;
				src++;
			}
			return ret;
}

int main()
{
	char arr1[20] = "wu wei qi yue";
	char arr2[] = " bu si niao";
	my_strcat(arr1, arr2);
	printf("%s", arr1);

	return 0;
}

六、strcmp的使用和模拟实现

  • 比较字符串的大小;
  • 比较的不是字符串的长度,而是对应位置上的字符大小
  • 标准规定:
    第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
    第⼀个字符串等于第⼆个字符串,则返回0
    第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
    那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。
int my_strcmp(const char* s1, const char* s2)
{
	
	assert(s1 && s2 != NULL);
	while(*s1 == *s2)
	{ 
		if (*s1 == '\0')
		{
			return 0;
		}
		s1++;
		s2++;
	}
	return (*s1 - *s2);
}

int main()
{
	char arr1[] = "abcdf";
	char arr2[] = "abcde";
	int ret = my_strcmp(arr1, arr2);
		printf("%d", ret);

	return 0;

}
  • 在标准环境下返回值通常为 <0 ; ==0 ; >0;
  • 而在 vs 环境下通常会 返回 -1 ; 0 ;1 。

七、strncpy,strncat,strncmp函数的使用

7.1 strncpy函数的使用
拷⻉num个字符从源字符串到⽬标空间。
如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

 

int main()
{
	char arr1[20] = "abcdef";
	char arr2[20] = "xxxxxxxxxxx";

	strncpy(arr2, arr1, 8);
	printf("%s\n", arr2);

	return 0;
}

 

7.2 strncat函数的使用

  • 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 符;
  • 如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。
int main()
{
	char arr1[20] = "abcdefyyyyyyyy";
	char arr2[20] = "xxxxxxxx";

	strncat(arr1, arr2, 3);

	printf("%s\n", arr1);

	return 0;
}

int main()
{
	char arr1[20] = "abcdef\0yyyyyy";
	char arr2[20] = "xxxxxxxx";

	strncat(arr1, arr2, 3);

	printf("%s\n", arr1);

	return 0;
}

7.3strncmp函数的使用

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

未完待续~~~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值