在我们编程的过程中,我们经常要处理字符和字符串,所以c语言标准库里提供了一系列的库函数。
一、字符分类函数
c语言中有一系列的函数是专门做字符分类的(判断这个字符是属于什么类型的字符的)。
这些函数的使用都需要包含一个头文件是ctype.h
这些函数的使用方法都很类似,就以一个函数进行举例
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;
}
二、字符转换函数
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函数在的内容下次再见真章。
希望大家在看完这个文章之后能有所收获,加油!!!
送给大家我很喜欢的一句话:心如花木,向阳而生。