C语言高级专题(11)------- 常见字符串库函数


字符串库函数


1、什么是字符串

  • (1)字符串就是由多个字符在内存中连续分布组成的字符结构。字符串的特点是指定了开头(字符串的指针)和结尾(结尾固定为字符’\0’),而没有指定长度(长度由开头地址和结尾地址相减得到)

2、为什么要讲字符串处理函数

  • (1)函数库为什么要包含字符串处理函数?因为字符串处理的需求是客观的,所以从很早开始人们就在写很多关于字符串处理的函数,然后逐渐形成了现在的字符串处理函数库。
  • (2)面试笔试时,常用字符串处理函数也是经常考到的点。

3、常用字符串处理函数

  • (1)C库中字符串处理函数包含在string.h中,这个文件在ubuntu系统中在/usr/include中
  • (2)常见字符串处理函数及作用:

1.memcpy


【1】函数原型void *memcpy(void *dest, const void *src, size_t n);

【2】函数功能:函数的作用是:从内存区src复制n个字节到内存区dest。内存区不能重叠。
注意:source和destin都不一定是数组,任意的可读写的空间均可。

【3】函数参数:destin-- 指向用于存储复制内容的目标数据,source-- 指向要复制的数据源 ,n-- 要被复制的字节数。

【4】函数返回值:该函数返回一个指向目标存储区destin的指针。


2.memset


【1】函数原型void *memset(void *s, int c, size_t n);

【2】函数功能:用常量字节c填充s指向的内存区域的前n个字节。

【3】函数返回值:该函数返回一个指向内存区域的指针。

【4】使用举例

 char str[10];
 memset(str, 0, sizeof(str));  

3.memcmp


【1】函数原型int memcmp(const void *s1, const void *s2, size_t n);

【2】函数功能:其功能是把存储区 str1 和存储区 str2 的前 n 个字节进行比较。该函数是按字节比较的(每个字节都被解释为无符号字符)。

【3】函数返回值

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str1 大于 str2。
  • 如果返回值 = 0,则表示 str1 等于 str2。

【4】应用举例

  • s1,s2为字符串时候memcmp(s1,s2,1)就是比较s1和s2的第一个字节的ascII码值;
  • memcmp(s1,s2,n)就是比较s1和s2的前n个字节的ascII码值;
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
	char *s1="abc";
	char *s2="acd";
	int ret = memcmp(s1,s2,3);
	printf("dest = %d\n",ret );     //ret = -1;
	return 0;
}
  • 就是比较s1和s2的前3个字节,第一个字节相等,第二个字节比较中大小已经确定,不必继续比较第三字节了。所以ret=-1.

4.memchr


【1】函数原型void *memchr(const void *s, int ch, size_t count);

【2】函数功能:其功能是从buf所指内存区域的前count个字节查找字符ch。

【3】函数返回值:当第一次遇到字符ch时停止查找。如果成功,返回指向字符ch的指针;否则返回NULL。

【4】应用举例

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
	const char *s1="abc";
	char *p = NULL;
	p = (char*)memchr(s1,'b',3);
	printf("*p = %c\n",*p);     // *p = b
   
	return 0;
}

5.strcpy


【1】函数原型char *strcpy(char *dest, const char *src);

【2】函数功能:strcpy把含有’\0’结束符的字符串复制到另一个地址空间dest。

【3】函数返回值:返回指向dest的指针。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

【4】strcpy的实现

char* strcpy(char* dest,const char* src)
{
	if((dest == NULL) || (src == NULL))
	{
		return NULL;
	}
	char* pdest = dest;     
	while((*pdest++ = *src++) != '\0');
	
	return pdest; 
}

【5】应用举例

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
	char dest[] = {0};
	const char *p = "hello world";
	strcpy(dest,p);

	printf("dest = %s\n",dest);     // *p = b
   
	return 0;
}

【6】strcpy和memcpy主要有以下3方面的区别

  • 1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
  • 2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
  • 3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

6.strncpy


【1】函数原型char *strncpy(char *dest, const char *src, size_t n);

【2】函数功能:把src指向的字符串的前n个字符(不包括’\0’,’\0’得自己手动加在*destin被复制之后)复制到destin指向的字符串中。如果要复制的src的部分有’\0’,就把’\0’复制进去,之后就提前结束,即使没复制到第n个字符也是。

【3】函数返回值:返回指向destin指针。

【4】应用举例

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
	char name[]="hellolinux",destin[20]={0};
	strncpy(destin,name,9);   
	printf("%s\n",destin);     //hellolinu

	char src[]="hello\0llinux";
	strncpy(destin,src,9);     //hello 
	printf("%s\n",destin);

	return 0;
}

7.strcat


【1】函数原型char *strcat(char *dest, const char *src);

【2】函数功能:把src所指向的字符串(包括’\0’)复制到dest所指向的字符串后面(删除dest原来末尾的’\0’)。要保证dest足够长,以容纳被复制进来的src。src中原有的字符不变。

【3】函数返回值:返回指向dest的指针。

【4】应用举例

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
	const char src[] = "hellolinux";
	char dest[] = "abcd";
	strcat(dest,src);
	printf("dest = %s\n",dest);   //dest = abcdhellolinux

	return 0;
}

8.strncat


【1】函数原型char *strncat(char *dest, const char *src, size_t n);

【2】函数功能:把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的’\0’,从而实现字符串的连接。
【3】函数返回值:返回指向dest的指针。

【4】应用举例

#include<stdio.h>
#include<string.h>
 
int main(void) 
{
    char dest[20] = "Hello";
    char src[10] = "World";
    strncat(dest, src, 5);   //n=5为src前n个字符
    printf("%s\n", dest);    //HelloWorld

    return  0; 
}

9.strcmp


【1】函数原型int strcmp(const char *s1, const char *s2);

【2】函数功能:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。

【3】函数返回值

  • 当s1<s2时,返回为负数;
  • 当s1=s2时,返回值= 0;
  • 当s1>s2时,返回正数。

【4】与memcmp类似,在这就不举例子了。


10.strncmp


【1】函数原型int strncmp(const char *s1, const char *s2, size_t n);

【2】函数功能:功能是把 s1 和 s2 进行比较,最多比较前 n 个字节,若前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。和strcmp相同。


11.strdup


【1】函数原型char *strdup(char *s);

【2】函数功能:将字符串拷贝到新建的位置处。strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。

【3】函数返回值:返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。

【4】应用举例

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main(void)
{
	char *s="hello linux";
	char *d;
	
	d=strdup(s);
	
	if(NULL != d) 
	{
		printf("%s\n",d);
		free(d);
	}
	return 0;
}

12.strchr


【1】函数原型char *strchr(const char *str, int c)

【2】函数功能:在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。

【3】函数返回值:返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。


14.strstr


【1】函数原型char *strstr(const char *str1, const char *str2);

【2】函数功能:函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。


15.strtok


【1】函数原型char *strtok(char s[], const char *delim);

【2】函数功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
例如:strtok("abc,def,ghi",","),最后可以分割成为abc def ghi.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"C语言字符串处理库函数大全-简书"是一篇在简书上的教程,介绍了C语言中常用的字符串处理库函数。 该教程详细介绍了C语言字符串操作的相关函数,包括库函数的使用方法和示例代码。通过该教程,读者可以学习到如何使用C语言中的字符串处理函数来进行字符串的复制、连接、比较、查找、截取等操作。 在这篇教程中,读者可以了解到以下一些常见字符串处理库函数: 1. strcpy:用于将一个字符串复制到另一个字符串中。 2. strcat:用于将一个字符串连接到另一个字符串的末尾。 3. strlen:用于计算一个字符串的长度。 4. strcmp:用于比较两个字符串的大小。 5. strchr:用于在一个字符串中查找指定字符的第一次出现位置。 6. strstr:用于在一个字符串中查找指定子串的第一次出现位置。 7. strtok:用于将一个字符串按照指定的分隔符分割成多个子串。 8. strncpy:用于将指定长度的字符串复制到目标字符串中。 9. strncmp:用于比较指定长度的两个字符串。 10. sprintf:用于将格式化的字符串输出到一个字符数组中。 这些函数在C语言中非常常用,并且对于字符串的处理非常方便。通过学习和掌握这些字符串处理库函数,可以更加高效地完成C语言程序中的字符串操作。 总之,"C语言字符串处理库函数大全-简书"这篇文章提供了丰富的字符串处理库函数以及示例代码,对于C语言开发者来说是一个很好的参考和学习资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值