首页 > 其他分享 >【C语言】字符函数和字符串函数

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

时间:2024-08-17 21:51:43浏览次数:14  
标签:字符 函数 str2 str1 C语言 char 字符串

文章目录


前言

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


一、字符分类函数

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

在这里插入图片描述


标签:字符,函数,str2,str1,C语言,char,字符串
From: https://blog.csdn.net/2302_76713442/article/details/141200994

相关文章

  • 麦克斯韦-玻尔兹曼速度分布函数 + 齐奥尔科夫斯基火箭方程
    这个速度分布律指出,在平衡态下,气体分子速率在\(v\)到\(v+\mathrmdv\)区间内的分子数占总分子数的百分比为\[\frac{\mathrmdN_v}N=4\pi\left(\fracm{2\pikT}\right)^{3/2}v^2\mathrme^{-\frac{mv^2}{2kT}}\mathrmdv\]故有分布函数为\[f(v)=4\pi\left(\fracm{2\pikT}......
  • 回调函数,字符函数,字符串函数
    前言:上一趴我们学习了指针。那么今天我们来学习新的知识,回调函数,字符函数,字符串函数。1回调函数什么是回调函数呢?回调函数就是通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。......
  • c语言计算二叉树的带权路径长度之和(WPL)
    1.WPL:树中全部叶节点的带权路径之和2.代码中所画的树为:3.求上述WPL:WPL=0*1+1*2+1*3+2*4+2*5=234.主要代码为:intwpl(Node*ROOT,inthigh){ intn=0; if(ROOT!=NULL){ n=ROOT->weight*high; n=n+wpl(ROOT->lchild,high+1); n=n+wpl(ROOT->rchild,high+1); } r......
  • 【漫谈C语言和嵌入式005】深入理解RAM与ROM:嵌入式系统存储器的核心
            在嵌入式系统设计中,存储器的选择与管理至关重要。存储器直接影响系统的性能、功耗和功能实现。在众多存储器类型中,RAM(随机存取存储器)和ROM(只读存储器)是最基本也是最重要的两类。理解它们的特点、区别和应用场景,对于设计高效、可靠的嵌入式系统至关重要。1.RA......
  • 【漫谈C语言和嵌入式006】深入解析NVRAM与Flash:嵌入式系统中的关键非易失性存储器
            在嵌入式系统设计中,非易失性存储器(Non-VolatileMemory,NVM)扮演着至关重要的角色。这类存储器能够在设备断电后保留数据,对于存储系统配置、固件、用户数据等关键信息至关重要。NVRAM(非易失性随机存取存储器)和Flash是两种常见的非易失性存储器类型,各有其独特的......
  • 【漫谈C语言和嵌入式004】深入理解RS232、RS422和RS485:嵌入式系统中的串行通信协议
            在嵌入式系统设计中,串行通信协议是设备间数据传输的重要方式。其中,RS232、RS422和RS485是三种常用的标准。这些协议不仅在工业控制、仪器仪表、网络通信等领域得到广泛应用,也在许多嵌入式系统项目中扮演着重要角色。在本文中,我们将深入探讨这三种串行通信标准......
  • 【漫谈C语言和嵌入式007】AD2S1210简介与应用:高精度旋转变压器到数字转换器的解析
            在精密运动控制和测量系统中,旋转变压器(Resolver)是一种常用的传感器,能够精确检测旋转轴的位置和速度。为了将旋转变压器的模拟信号转换为数字信号,便于微控制器或DSP进行处理,AD2S1210作为一款高性能的旋转变压器到数字转换器(RDC),为工程师提供了高精度、低延迟的......
  • 虚函数的定义、用法以及纯虚函数和虚析构函数
    虚函数虚函数是一种成员函数,它允许子类重写(override)父类中定义的函数。虚函数的重要意义便是实现多态性。多态性是面向对象编程的一个核心概念:即同一个接口可以有不同的实现,从而实现代码的灵活性和通用性目录1.虚函数的定义2.虚函数的用法3.纯虚函数和抽象类4.虚析......
  • C/C++ 拷贝构造函数 | 赋值构造函数 | 移动构造函数 | 移动赋值构造函数
    文章目录前言1.拷贝构造函数(CopyConstructor)2.赋值构造函数(CopyAssignmentOperator)3.移动构造函数(MoveConstructor)4.移动赋值构造函数(MoveAssignmentOperator)总结前言C++中关于一个对象的构造,就有很多讲究。其中最常用的可能就是拷贝构造函数......
  • Python之字符串例题2道
    实例1:记录成绩实例2:回文实例1:记录成绩将语文数学英语的成绩一次性输入,用空格隔开,例如“899690”利用split()函数可以对字符串以指定的字符进行切割,这里括号内没有指定字符,默认以空格作为切割标志。如score=input().split()会得到一个列表[89,96,90]然后再通......