学习c语言:字符函数和字符串函数

        在我们编程的过程中,我们经常要处理字符和字符串,所以c语言标准库里提供了一系列的库函数。

一、字符分类函数

        c语言中有一系列的函数是专门做字符分类的(判断这个字符是属于什么类型的字符的)。

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

 这些函数的使用方法都很类似,就以一个函数进行举例

int islower ( int c ); 

islower 是能够判断参数部分的c是否是小写字母。如果是小写字母就返回一个非零的整数,如果不是就返回0.这个函数是通过返回值来判断的。

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

#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;
}

二、字符转换函数

c语言提供了两个字符转换函数:

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

 在上面字符分类函数中,我们的代码是先判断str[i]为小写字母,然后再进行-32操作实现,小写转大写。而有了转换函数我们直接就能用toupper函数实现。

#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=toupper(c);
			putchar(c);//输出一个字符
			i++;
		}
	}
	return 0;
}

 三、strlen的使用和模拟实现

先回顾一下strlen函数的使用。

size_t strlen ( const char * str ); 

  •  字符串的结束标志为‘\0’,strlen函数返回的是字符串中'\0'之前出现的字符个数(不包含'\0')。
  • 参数指向的字符串必须要以‘\0’结束。
  • 函数的返回值是size_t类型,是无符号的。
  • strlen的使用必须包含头文件 #include <string.h>.

设想一下下面这个代码会输出什么

#include <stdio.h>
#include <string.h>
int main() {
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0) {//返回的是无符号整型
		printf("str2>str1\n");
	}
	else {
		printf("str1>str2\n");//若想实现需要强转为int
	}
	return 0;
}

 strlen(str2)==3  而strlen(str1)==6  

上述代码输出  str2>str1

这是为什么呢?   因为strlen返回的是无符号整型 上述if语句中返回的是一个无符号整型的数,是一个很大的正数。如果想要实现else语句中的功能需要将if语句中强转为int类型。

strlen的模拟实现:

 方法一:

//计数器方式
#include <stdio.h>
#include <assert.h>
int my_strlen(const char *arr) {
	int count = 0;
	assert(arr);
	while (*arr) {
		count++;
		arr++;
	}
	return count;
}
int main() {
	int arr[] = "abcdefg";
	int ret = my_strlen(arr);
	printf("%d ", ret);
	return 0;
}

 方法二:

//不能创建临时变量计数器
#include <stdio.h>
#include <assert.h>
int my_strlen(const char *arr) {
	assert(arr);
	if (*arr == '\0') {
		return 0;
	}
	else {
		return 1 + my_strlen(arr + 1);
	}
}
int main() {
	int arr[] = "abcdefg";
	int ret = my_strlen(arr);
	printf("%d ", ret);
	return 0;
}

 方法三:

//指针-指针的方式
#include <stdio.h>
#include <assert.h>
int my_strlen(char *arr) {
	assert(arr);
	char* p = arr;
	while (*p != '\0') {
		p++;
	}
	return p - arr;
}
int main() {
	char arr[] = "abcdefg";
	int ret = my_strlen(arr);
	printf("%d ", ret);
	return 0;
}

四、strcpy的使用和模拟实现

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

  •  源字符串必须以‘\0’结束。
  • 源字符串中的‘\0’也将拷贝到目标空间中。
  • 目标空间必须足够大,以确能保存源字符串。
  • 目标空间必须可修改。

 strcpy函数的使用

#include <stdio.h>
#include <string.h>
int main() {
	char arr1[20] = { 0 };
	char arr2[] = "hello every one";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

 strcpy函数的模拟实现

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src) {
	char* ret = dest;
	assert(dest && src);
	while ((*dest++ = *src++)) {
		;
	}
	return ret;
}
int main() {
	char arr1[20] = { 0 };
	char arr2[] = "hello every one";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

 五、strcat的使用和模拟实现

  • 源字符串必须以‘\0’结束。
  • 目标字符串中也得有\0,否则不知道追加从哪里开始。
  • 目标空间必须足够大,能容纳下源字符串中的内容。
  • 目标空间必须可以修改。

strcat函数的使用

#include <stdio.h>
#include <string.h>
int main() {
	char arr1[30] = "abcd\0efg";
	char arr2[] = "hello";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

 strcat函数的模拟函数的实现

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src) {
	char* ret = dest;
	assert(dest && src);
	while (*dest) {
		dest++;
	}
	while ((*dest++ = *src++)) {
		;
	}
	return ret;
}
int main() {
	char arr1[30] = "abcd\0efg";
	char arr2[] = "hello";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

 六、strcmp的使用和模拟实现

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字
  • 那么是如何判断两个字符串的大小呢?是通过比较两个字符串中对应位置上字符ASCII码值的大小。

 strcmp函数的使用

#include <stdio.h>
#include <string.h>
int main() {
	char arr1[] = "abcdef";
	char arr2[] = "abcdg";
	int ret = strcmp(arr1, arr2);
	if (ret > 0) {
		printf("arr1>arr2\n");
	}
	else if (ret < 0) {
		printf("arr1<arr2\n");
	}
	else {
		printf("arr1=arr2\n");
	}
	return 0;
}

strcmp函数的模拟实现 

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2) {
	assert(str1 && str2);
	while (*str1 == *str2) {
		if (str1 == '\0') {
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main() {
	char arr1[] = "abcdef";
	char arr2[] = "abcdg";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0) {
		printf("arr1>arr2\n");
	}
	else if (ret < 0) {
		printf("arr1<arr2\n");
	}
	else {
		printf("arr1=arr2\n");
	}
	return 0;
}

 总结: 本章介绍了字符函数以及长度不受限制的字符串函数的使用,以及不受限制的字符串函数的模拟使用。剩余的长度受限制的字符串、strstr函数、strtok函数和strerror函数在的内容下次再见真章。

希望大家在看完这个文章之后能有所收获,加油!!!

送给大家我很喜欢的一句话:心如花木,向阳而生。 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值