文章目录
前言
一、二:字符函数(字符分类函数:介绍了字符的各种类型,如控制字符(不可打印字符)、可打印字符、图形字符、标点符和空白间隔字符;字符转换函数:字母大小写的转换)
三~九:字符串函数(字符串函数的分类;各种字符串函数的具体使用)
一、字符分类函数
库函数中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。
这些函数的使用都需要包含⼀个头文件是 ctype.h
函数 | 参数符合条件返回真,不符合返回0(假) |
---|---|
islower | 检查字符是否为小写字符(字母) |
isupper | 检查字符是否为大写字符(字母) |
isalpha | 检查字符是否为字母 |
isdigit | 检查字符是否为数字字符 |
isalnum | 检查字符是否为字母或数字字符 |
isxdigit | 检查字符是为十六进制字符(包括所有数字字符0 ~ 9、小写字母a ~ f、大写字母A ~ F) |
isprint | 检查字符是否为可打印字符 |
iscntrl | 检查字符是否为控制字符(不可打印字符) |
isspace | 检查字符是否为空白间隔字符( 空格符 ’ ’ 、回车符 ‘\r’、换行符 ‘\n’、水平制表符 ‘\t’、垂直制表符 ‘\v’、换页符 ‘\f’ ) |
ispunct | 检查字符是否为标点符(所有不属于字母和数字的图形字符) |
isgraph | 检查字符是否为图形字符(除空格字符 ’ ’ 之外的所有可打印的字符) |
注:ASCII表中的0~31及127 (共33个)都是控制字符(表示某一控制功能的字符),也称不可打印字符,它们无法被打印在屏幕上观察。32-126为打印字符。(详见链接: link)
int islower(int c); //参数部分是int类型,输入一个字符,它会自动转换成字符的ASCll值传递给函数;返回值也是int类型。
int isupper(int c);
int isalpha(int c);
int isdigit(int c);
//所有字符分类函数的参数类型和返回值类型都是一致的。
示例演示一下isalpha和isdigit函数的使用,其他字符分类函数的使用非常类似:
有一个字符串,找出字符串中所有的字母并打印;再找出字符串中所有的数字字符并打印。
#include <stdio.h>
#include <ctype.h>
int main()
{
char str[] = "Zh211ABC996@qq.com985";
int i = 0;
while (str[i])
{
if (isalpha(str[i]))//判断字符是否为字母
{
printf("%c", str[i]);
}
i++;
}
printf("\n");
i = 0;
while (str[i])
{
if (isdigit(str[i]))//检查字符是否为数字字符
{
printf("%c", str[i]);
}
i++;
}
printf("\n");
return 0;
}
二、字符转换函数
C语言提供了2个字符转换函数(这些函数的使用也需要包含头文件 ctype.h):
int tolower ( int c ); //将参数传进去的大写字母转小写
int toupper ( int c ); //将参数传进去的小写字母转大写
示例演示字符转换函数的使用:
完成字母大小写转换。有一个字符串,判断字符串中的每一个字符是否为大写字母,如果是,将它转换成小写字母;反之则转换为大写字母。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "ABC3023Zh @ qq.com";//非字母字符不进行转换,保持原样
while (str[i])
{
if (islower(str[i]))//判断字符是否为小写字母
{
str[i] = toupper(str[i]);//将传进去的小写字母转大写
}
else if (isupper(str[i]))//判断字符是否为大写字母
{
str[i] = tolower(str[i]);//将传进去的大写字母转小写
}
printf("%c", str[i]);
i++;
}
return 0;
}
三、字符串函数的分类
函数 | 作用 |
---|---|
strlen | 返回给定字符串的长度 |
strcpy | 复制一个字符串给另一个 |
strncpy | 复制来自一个字符串的一定量字符给另一个 |
strcat | 连接两个字符串 |
strncat | 连接两个字符串的一定量字符 |
strcmp | 比较两个字符串 |
strncmp | 比较两个字符串的一定量字符 |
strstr | 寻找字符子串的首次出现 |
strtok | 寻找字符串中的下个记号 |
注:字符串函数的使用都要包含头文件 string.h
四、strlen函数的使用
size_t strlen ( const char * str );
//从给定的起始位置开始,向后统计 ‘\0’ 之前的字符个数
• 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
• 注意函数的返回值为 size_t,是无符号的
注: size_t 类型是一种无符号整数类型,但它在不同的系统上的定义可能不太一样,size_t在32位系统上定义为 unsigned int,在64位系统上定义为 unsigned long。我们一般使用 %zd格式 来打印size_t类型的数据。
示例演示strlen函数的使用:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcdef";
char str2[] = "hijklmn";
printf("%zd\n", strlen(str1));
printf("%zd\n", strlen(str2));
printf("%zd\n", strlen(str2 + 2));
return 0;
}
五、strcpy和strncpy函数的使用
1.strcpy
char* strcpy(char * destination, const char * source );
//将字符指针source(源头)指向的字符串复制到字符指针destination(目的地)指向的字符数组中,包括 ‘\0’ 字符(并在该点处停止)。
//返回字符指针destination
• 会将源字符串中的 ‘\0’ 拷贝到目标空间。
• 目标空间必须足够大,以确保能存放源字符串。
• 目标空间必须可修改。(所以destination前面没有用const修饰)
示例演示strcpy函数的使用:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcdef";
char str2[20] = { 0 };
strcpy(str2, str1);
printf("%s\n", str2);
char str3[] = "xxxxxxxxxx";//通过下方调试图片可以观察到str1指向的字符串(包含'\0')一并复制到str3指向的字符数组中
printf("%s\n", strcpy(str3, str1));
return 0;
}
2.strncpy
char * strncpy ( char * destination, const char * source, size_t num );
//将字符指针source指向的字符串的前 num 个字符复制到字符指针destination所指向的字符数组中。
//如果在复制 num 个字符之前找到源字符串的末尾(由字符’\0’表示),则 destination所指向的字符数组将用零填充,直到总共写入 num 个字符。
//返回字符指针destination
• 拷贝num个字符从源字符串到目标空间。
• 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
示例演示strncpy函数的使用:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcdef";//字符串中包含'a'、'b'、'c'、'd'、'e'、'f'、'\0'共7个字符
char str2[20] = { 0 };
strncpy(str2, str1, 4);//只将str1指向的字符串的前4个字符复制到str2所指向的字符数组中。
printf("%s\n", str2);
char str3[] = "xxxxxxxxxxxxxx";
printf("%s\n", strncpy(str3, str1, 10));//str1指向的字符串的长度小于10,则拷贝完str1指向的字符串之后,在str3指向的字符串的后边再追加3个0。
return 0;
}
六、strcat和strncat函数的使用
1.strcat
char * strcat ( char * destination, const char * source );
//将字符指针source指向的字符串追加到目标字符串后面。从目标字符串的终止字符’\0’开始追加源字符串(包含源字符串的终止字符’\0’),目标字符串的终止字符’\0’被源字符串第一个字符覆盖。
//返回字符指针destination
• 目标字符串中得有 \0 ,否则没办法知道追加从哪开始。
• 目标空间必须有足够的大,能容纳下源字符串的内容。
• 目标空间必须可修改。
示例演示strcat函数的使用:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcdef";
char str2[20] = "123";
printf("%s\n", strcat(str2, str1));
char str3[20] = "12345\0xxxxxxxx";
printf("%s\n", strcat(str3, str1));//下方调试演示了将str1指向的字符串追加到str3指向字符串后面的过程
return 0;
}
2.strncat
char * strncat ( char * destination, const char * source, size_t num );
//将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加一个 \0 字符。
//如果source 指向的字符串的长度小于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾。
//返回字符指针destination
示例演示strncat函数的使用:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcdef";
char str2[20] = "123";
printf("%s\n", strncat(str2, str1, 3));//将str1指向字符串的前3个字符追加到str2指向的字符串末尾,然后再追加一个 '\0' 字符。
char str3[20] = "12345\0xxxxxxxxxx";
printf("%s\n", strncat(str3, str1, 10));//str1指向的字符串的长度小于10,只会将str1指向的字符串(包含'\0')追加到str3指向的字符串末尾。
return 0;
}
七、strcmp和strncmp函数的使用
1.strcmp
int strcmp ( const char * str1, const char * str2 );
//将str1所指向的字符串与str2所指向的字符串进行比较。
//此函数开始比较这两个字符串的第一个字符(比较字符的ASCll码值)。如果它们彼此相等,则继续比较下对字符,直到字符不同或达到终止字符 ‘\0’ 为止。
标准规定:
• 第一个字符串大于第二个字符串,则返回大于0的数字
• 第一个字符串等于第二个字符串,则返回0
• 第一个字符串小于第二个字符串,则返回小于0的数字
示例演示strcmp函数的使用:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcdef";
char str2[] = "abcd";
printf("%d\n", strcmp(str1, str2));
char str3[] = "abcdef";
printf("%d\n", strcmp(str1, str3));
char str4[] = "bbcd";
printf("%d\n", strcmp(str1, str4));
return 0;
}
2.strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
//比较str1所指向的字符串和str2所指向的字符串的前num个字符,如果相等就继续往后比较,最多比较num个字符,如果提前发现不一样,就提前结束。如果num个字符都相等,就是相等返回0.
示例演示strncmp函数的使用:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcdef";
char str2[] = "abcd";
printf("%d\n", strncmp(str1, str2, 4));//只比较str1和str2的前4个字符。前4个字符都相等,就是相等返回0.
printf("%d\n", strncmp(str1, str2, 5));
return 0;
}
八、strstr函数的使用
char * strstr ( const char * str1, const char * str2);
//返回str1指向的字符串中第一次出现str2指向的字符串的地址(指针),如果str2指向的字符串不是str1指向的字符串的一部分,则返回NULL指针(被赋值为0的指针)。
• 函数返回字符串str2在字符串str1中第一次出现的位置。
• 字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志。
示例演示strstr函数的使用:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "i love china";
char str2[] = "love";
char* ch = strstr(str1, str2);
if (ch == NULL)
printf("没有在str1中找到str2\n");
else
printf("%s\n", ch);
char str3[] = "hi";
ch = strstr(str1, str3);
if (ch == NULL)
printf("没有在str1中找到str3\n");
else
printf("%s\n", ch);
char str4[] = "lovv";
ch = strstr(str1, str4);
if (ch == NULL)
printf("没有在str1中找到str4\n");
else
printf("%s\n", ch);
return 0;
}
九、strtok函数的使用
char * strtok ( char * str, const char * sep);
• 第二个参数sep指向一个字符串,定义了用作分隔符的字符集合
• 第一个参数指定一个字符串,它包含了0个或者多个分隔符分割的标记。
• strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
• strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
• strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
• 如果字符串中不存在更多的标记,则返回 NULL 指针。
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "302377@qq.com";
char sep[] = ".@";//分隔符(标记)为'.'和'@'
char* p = strtok(str, sep);//strtok函数将找到str中第一个标记,将其替换成 '\0',并保存它在字符串中的地址。返回str
printf("%s\n", p);
while( p = strtok(NULL, sep))//strtok函数将在同一个字符串中被保存的地址开始寻找下一个标记
{
printf("%s\n", p);
}
return 0;
}