【C语言】字符函数和字符串函数


前言

一、二:字符函数(字符分类函数:介绍了字符的各种类型,如控制字符(不可打印字符)、可打印字符、图形字符、标点符和空白间隔字符;字符转换函数:字母大小写的转换)
三~九:字符串函数(字符串函数的分类;各种字符串函数的具体使用)


一、字符分类函数

库函数中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。
这些函数的使用都需要包含⼀个头文件是 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;
}

在这里插入图片描述


  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值