【C语言】常用字符串函数大全(超详笔记收藏必备)

这个章节,我们探讨C语言常用字符串函数。
重点介绍处理字符和字符串的库函数的使用和注意事项
如有兴趣也可以看看 字符串函数如何模拟实现

字符串函数头文件 #include

gets (fgets)字符串输入函数文件 #include

文章目录

  • strlen
  • strcpy
  • strcat
  • strcmp
  • strncpy
  • strncat
  • strncmp
  • strchr
  • strrchr
  • strtok
  • gets
  • fgets

strlen

该函数是求字符串长度的。

size_t strlen ( const char * str );

相信大多数人对该字符串函数比较熟悉了,那我们看看直接看看注意事项吧,第三点大家可能比较容易忽略!。

注意事项

  1. 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
  2. 参数指向的字符串必须要以 ‘\0’ 结束。
  3. 注意函数的返回值为size_t,是无符号的( 易错 )

下面输出的结果什么??

#include
int main()
{
	if (strlen("abc") - strlen("abcdef") > 0)
	{
		printf(">");
	}
	else
	{
		printf("<");
	}
	return 0}

解析:

答案是:>
因为 函数的返回值为size_t,是个无符号整型、 两个无符号的数相减在内存补码存储的还是正数,所以打印了>


strcpy

字符串复制(拷贝)函数

char* strcpy(char * destination, const char * source );
参数说明:

destination:表示复制的目标字符数组;
source:表示复制的源字符数组

注意事项

  1. 将源指向的 C 字符串复制到目标指向的数组中,包括终止的 null 字符(并在该点停止)。
  2. 源字符串必须以 ‘\0’ 结束。
  3. 会将源字符串中的 ‘\0’ 拷贝到目标空间
  4. 目标空间必须足够大,以确保能存放源字符串。
  5. 目标空间必须可变。

函数使用方法:

#include
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "abcdef";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
	}

最终输出结果:
abcdef


strcat

将两个字符串连接(拼接)起来。

char * strcat ( char * destination, const char * source );
参数说明

Destination:目的字符串;
Source:源字符串。

返回值:

该函数返回一个指向最终的目标字符串 Destination 的指针。

注意事项:

  1. 将源字符串的副本追加到目的字符串后面。目的中的最后一个 ‘\0’ 字符,被源的第一个字符覆盖,并且在目的中由两者串联形成的新字符串的末尾包含一个’ \0’。
  2. 源字符串必须以 ‘\0’ 结束。
  3. 目标空间必须有足够的大,能容纳下源字符串的内容。
  4. 目标空间必须可修改
  5. 字符串不能自己给自己追加!。自己给自己追应用strncat库函数

函数使用方法:

#include
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "def";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

最终输出结果:abcdef


strcmp

字符串比较,把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

int strncmp ( const char * str1, const char * str2, size_t num );
参数说明:

str1 – 要进行比较的第一个字符串。
str2 – 要进行比较的第二个字符串。

标准规定:返回值

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

函数使用方法:

#include 
#include 
 
int main ()
{
   char str1[] = "abcdef";
   char str2[] = "ABCDEF";
   int ret = 0;
   
   ret = strcmp(str1, str2);
 
   if(ret < 0)
   {
      printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
      printf("str1 大于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return 0 ;
}

最终输出结果:
str1 大于 str2


strncpy

复制字符串source中的内容—到字符串destination中,复制多少由num的值决定。

char * strncpy ( char * destination, const char * source, size_t num );
参数说明:

destination:表示复制的目标字符数组;
source:表示复制的源字符数组;
num:表示复制的字符串长度。

返回值

该函数返回最终复制的字符串。

注意事项

  1. 将源的第一个字符数复制到目标字符。如果在复制 num 个字符之前找到源 C 字符串的末尾(由空字符表示),则用零填充目标,直到总共写入 num 个字符为止。
  2. 拷贝num个字符从源字符串到目标空间。
  3. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
  4. strncpy 没有自动加上终止符的,需要手动加上不然会出问题的。

函数使用方法:

#include 
#include 

int main()
{
	char destination[40] = "This is destination";
	char source[] = "This is source";
      
	strncpy(destination, source, 10);
	 //strncpy 没有自动加上终止符的,需要手动加上不然会出问题的。
	destination[10] = '\0';
	printf("最终的目标字符串: %s\n", destination);
	return 0;
}

最终输出结果:
最终的目标字符串: This is sostination


strncat

追加子符串str2 中的内容—到字符串 str1 的结尾,增加多少由num的值决定。

int strncmp ( const char * str1, const char * str2, size_t num );
参数说明:

str1 – 指向目标数组
str2 – 要追加的字符串
num --要追加的最大字符数

返回值:

该函数返回一个指向最终的目标字符串 str1 的指针。

注意事项

  1. 将str2的第一个字符开始追加到目标,外加一个终止 ‘\0’ 字符。
  2. 如果str2 中 C 字符串的长度小于 num,则仅复制终止字符之前的内容。
  3. str1 空间要足够大 不然会越界访问

函数使用方法:

#include 
#include 

int main()
{
	char str1[50] = "This is str1";
	char str2[50] = "This is str2";

	strncat(str1, str2, 15);

	printf("最终的目标字符串:%s", str1);

	return 0 ;
}

最终输出结果:
最终的目标字符串:This is str1This is str2


strncmp

把 str1 和 str2 进行比较,最多比较前 num个字符

int strncmp ( const char * str1, const char * str2, size_t num );
参数说明:

str1 – 要进行比较的第一个字符串。
str2 – 要进行比较的第二个字符串。
n – 要比较的最大字符数。

标准规定:返回值

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

函数使用方法:

#include 
#include 

int main()
{
    char str1[] = "abcdef";
    char str2[] = "ABCDEF";
    int ret = 0;

    ret = strncmp(str1, str2,4);

    if (ret < 0)
    {
        printf("str1 小于 str2");
    }
    else if (ret > 0)
    {
        printf("str1 大于 str2");
    }
    else
    {
        printf("str1 等于 str2");
    }
  

最终输出结果:
str1 大于 str2


strchr

用于查找字符串中的一个字符,并返回该字符在字符串中第一次出现的位置。

char *strchr(const char *str, int c)
参数说明:

str :在str字符串中查找
C: 要定位的字符。它作为其 int 提升传递,但在内部转换回 char 进行比较。

返回值:

如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针,如果未找到该字符则返回 NULL。

函数使用方法:

#include
#include
int main()
{
	const char str[] = "abcef";
	const char c = 'e';
	char* arr = strchr(str, c);
	if (str == NULL)
	{
		printf("该字符串不存在该字符\n");
	}
	else
	{
		printf("%s\n", arr);
	}
	return 0;
}

最终输出结果:
ef


strrchr

查找字符串中最后一个出现的字符

char *strrchr(const char *str, int c)
参数说明:

str: 在str字符串中查找 c第一次出现的字符
c : 要定位的字符。它作为其 int 提升传递,但在内部转换回 char。

返回值:

如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针,如果未找到该字符则返回 NULL。

函数使用方法:

#include
#include
int main()
{
	char arr[] = "caaa,ceee";
	char c = 'c';
	char* str = strrchr(arr, c);
	if (str == NULL)
	{
		printf("该字符串不存在该字符\n");
	}
	else
	{
		printf("%s\n", str);
	}
	return 0;
}

最终输出结果:
ceee


strtok

切割字符串 (该函数使用方法较难,请耐心看完)

char * strtok ( char * str, const char * sep );
参数说明:

str : 要被分解成一组小字符串的字符串。
sep: 所要切割字符串。这些可能因调用而异

返回值:

当s中的字符查找到末尾时,返回NULL;
如果查不到sep 所标示的字符,则返回当前strtok的字符串的指针。

注意事项:

  1. sep参数是个字符串,定义了用作分隔符的字符集合
  2. 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  3. strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
  4. strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。
  5. strtok函数的第一个参数不为NULL时 ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  6. strtok函数的第一个参数为 NULL时 ,函数将在同一个字符串中被保存的位置开始,查找下一个标记
  7. 如果字符串中不存在更多的标记,则返回 NULL 指针

可能有点抽象,那就结合下面代码跟注释一起耐心观看。

#include
#include

int main()
{
	char str[] = "[email protected]";
	char sep[] = "@.";//所要分割的字符



	//第一次分割时不为NULL时,strtok函数将保存它在字符串中的位置
	//并把&改为 '\0' 此时的字符串为"XM'\0'Life.CSDN"
	//打印了XM
	char* arr = strtok(str, sep);
	printf("%s\n", arr);



	//strtok函数的第一个参数为 NULL时 ,函数将在同一个字符串中被保存的位置开始,查找下一个标记
	//此时从'\0'下一个位置开始寻找接收Life.CSDN
	//并把.改为 '\0' 此时的字符串为"XM'\0'Life'\0'CSDN"
	//打印了Life
	arr = strtok(NULL, sep);
	printf("%s\n", arr);



	//strtok参数依然为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记
	//此时从刚刚.变成的'\0' 下一个位置开始查找,遇见'\0'就停止了
	//打印了CSDN
	arr = strtok(NULL, sep);
	printf("%s\n", arr);



	//字符串中不存在更多的标记,则返回 NULL 指针。
	arr = strtok(NULL, sep);
	printf("%s\n", arr);


	return 0;
}

最终输出结果
XM
Life
CSDN
NULL

可能大家发现这样的函数使用太过生硬,如果seq 切割字符串过长,那要写多少个arr。下面有个成妙的方法可以解决这个问题
函数使用方法:

#include
#include
int main()
{
	char str[] = "[email protected]";
	char sep[] = "@.";//所要分割的字符
	char* arr = NULL; //先初始化arr

	for (arr = strtok(str, sep); arr != NULL; arr = strtok(NULL, sep))
	{
		printf("%s\n", arr);
	}

	return 0;
}

最终输出结果
XM
Life
CSDN


gets

从标准流输入中获取字符串.(标准流可以理解成键盘输入);

注意事项:

C 标准在 2011 年明确地从其规范中删除了此功能。
该函数在 C/C++ 中已弃用(自 2014 年标准起)。
如果依然要使用,会报警告,而且非常危险。
这里建议使用类型的库函数 fgets,相比gets安全。


fgets

从任意流stream 读取一行,并把它存储在 str 所指向的字符串内,当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止。该文件操作函数可以当做gets函数使用

char *fgets(char *str, int n, FILE *stream)
参数说明:

  • str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
  • n – 这是要读取的最大字符数(包括最后的空字符)。
  • stream – 指向读取的流。当然第三个参数也可以所有输入流如:stdin(标准流可以理解成键盘输入) 类似gets一样可以使用从键盘输入

返回值:

如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。

函数类似gets使用方法:
(这里只简单介绍如何当做gets函数使用)

#include
#include

int main()
{
	char str[50] = { 0 };

	fgets(str, 10, stdin);

	printf("%s\n", str);
	return 0;
}

输入:abc
最终输出结果:abc


你可能感兴趣的:(C语言,c语言,算法,c++)