在编程过程中,我们经常要处理字符和字符串,C语言标准库中就提供了一系列的库函数,便于我们操作库函数。
字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
这些函数的使⽤⽅法⾮常类似,我们一一个函数为例,各位理解后可以去类比使用:
islower 是一个能够判断参数部分的 形参是否是⼩写字⺟的函数。通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。
练习:写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。
法一:
#include<stdio.h>
int main()
{
char arr[] = "What can I say, man!!!";
int i = 0;
while (arr[i] != '\0')
{
if (arr[i] <= 122 && arr[i] >= 97)
{
arr[i] -= 32;
}
i++;
}
printf("%s\n", arr);
return 0;
}
本段代码利用的使小写字母的ascii值的范围进行操作,我们可以利用islower函数。
法二:
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "What can I say, man!!!";
int i = 0;
while (arr[i] != '\0')
{
if (islower(arr[i]))
{
arr[i] -= 32;
}
putchar();
i++;
}
printf("%s\n", arr);
return 0;
}
字符转换函数
C语言中由两个字符转换函数:
1、 int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
2、 int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
了解了字符转换函数的用法后,我们可以修改一下上面的练习:
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "What can I say, man!!!";
int i = 0;
char c;
while (arr[i] != '\0')
{
c = arr[i];
if (islower(arr[i]))
{
c = toupper(arr[i]);
}
putchar(c);
i++;
}
return 0;
}
strlen函数的使用和模拟实现
strlen
函数原型:size_t strlen ( const char * str );
strlen的使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdef";
int ret = strlen(arr);
printf("%d\n",ret);//6
return 0;
}
注意事项:
strlen函数的模拟实现
法一:计数器法
//(创建变量)计数器版本
#include<stdio.h>
#include<assert.h>
void my_strlen(const char* str)
{
assert(str != NULL);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
printf("%d\n", count);
}
int main()
{
char arr[] = "abcdef";
my_strlen(arr);
return 0;
}
法二:指针-指针(结果的绝对值使两指针之间的元素个数)
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
assert(str);
char* ret = str;
while (*str != '\0')
str++;
return str - ret;
}
int main()
{
char arr[] = "abcdef";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
法三:递归法
//递归法(无需创建变量)
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
assert(str);
if (*str == '\0')
return 0;
else
{
return 1 + my_strlen(str + 1);
}
}
int main()
{
char arr[] = "abcdef";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
strcpy函数的使用和模拟实现
strcpy的使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "************";
char arr2[] = "world";
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;
// while (*src != '\0')
// {
// *dest = *src;
// dest++;
// src++;
// }
// return ret;
//}
优化版本
char* my_strcpy(char* dest, const char* sorce)
{
assert(dest && sorce);
char* ret = dest;
while (*dest++ = *sorce++)
;//结果相同但极大缩减了代码
return ret;
}
int main()
{
char arr1[20] = "*********";
char arr2[] = "hello world";
char* ret = my_strcpy(arr1, arr2);
printf("%s\n", ret);
return 0;
}
strcat函数的使用和模拟实现
strcat的使用
//strcat
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
char* ret = strcat(arr1, arr2);
printf("%s\n", ret);
return 0;
}
注意事项:
模拟实现strcat函数
//strcat函数的模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest != '\0')
dest++;
while (*dest++ = *src++)
;
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
char* ret = my_strcat(arr1, arr2);
printf("%s\n", ret);
return 0;
}