文章目录
一、字符分类函数
二、字符转换函数
三、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个字符转换函数:
- int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
- 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 的模拟实现使用了两种方法:
- 模拟计算器
- 指针 - 指针
下面我可以用第三种方法: 函数递归
#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:
- \0:'\0' 表示 \ddd ,ddd表示 1~3个8进制数字, \0 的ASCII值是 0;
- 数字字符 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.
未完待续~~~