目录
字符串库函数
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.