知识点【字符串操作】
以str开头 遇到'\0'结束
1、strlen测字符串长度函数
#include <string.h>
size_t strlen(const char *s);
功能:测量s指向字符串的有效字符数量(遇到'\0'结束统计 不包含'\0')
参数:
s:字符串的起始地址
返回值:为测量的字节数
#include <string.h>
void test01()
{
printf("%lu\n", strlen("hello world"));//11
printf("%lu\n", strlen("hello\0world"));//5
printf("%lu\n", strlen("\123456\\x78\79\x12345hello"));//16
return;
}
2、字符串拷贝函数
strcpy strncpy
#include <string.h>
char *strcpy(char *dest, const char *src);
功能:将src指向的字符串 拷贝到 dest指向空间
注意:
dest执行的空间必须可读可写
返回值:返回值dest指向的空间起始地址
意义是完成链式操作。
char *strncpy(char *dest, const char *src, size_t n);
功能:只拷贝src的前n字节到dest指向空间中
案例1:以下代码的问题
char *dst="hello world";
strcpy(dst,"hello");//段错误 dst指向的文字常量区不允许被赋值
案例2:strcpy返回值的意义
案例3:strncpy
案例4:以下代码问题
char name[32]="";
name="lucy";//error name为数组名 不能被赋值 必须使用strcpy(name,"lucy")
3、字符串追加函数
#include <string.h>
char *strcat(char *dest, const char *src);
功能:将src指向字符串 追加到 dest指向的字符串末尾(第一个'\0'的位置)
char *strncat(char *dest, const char *src, size_t n);
功能:将src指向字符串的前n个字节 追加到 dest指向的字符串末尾(第一个'\0'的位置)
4、strcmp/strncmp 函数
#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:比较s1和s2指向的两个字符串的大小
返回值:
相等 返回0
大于 返回>0
小于 返回<0
int strncmp(const char *s1, const char *s2, size_t n);
功能:比较s1和s2指向的两个字符串前n个字节的大小
返回值:
相等 返回0
大于 返回>0
小于 返回<0
void test05()
{
char str1[]="hello world";
char str2[]="hello";
if(strcmp(str1,str2) == 0)
{
printf("%s等于%s\n",str1,str2);
}
else if(strcmp(str1,str2)>0)
{
printf("%s大于%s\n",str1,str2);
}
else if(strcmp(str1,str2)<0)
{
printf("%s小于%s\n",str1,str2);
}
if(strncmp(str1,str2,5) == 0)
{
printf("%s等于%s\n",str1,str2);
}
else if(strncmp(str1,str2,5)>0)
{
printf("%s大于%s\n",str1,str2);
}
else if(strncmp(str1,str2,5)<0)
{
printf("%s小于%s\n",str1,str2);
}
}
5、字符查找函数
#include <string.h>
char *strchr(const char *s, int c);
功能:从s指向的字符串中 查找第一次出现的字符c的地址(失败返回NULL)
char *strrchr(const char *s, int c);
功能:从s指向的字符串逆序查找第一次出现的字符c的地址(失败返回NULL)
6、字符串匹配函数
#include <string.h>
char *strstr(const char *haystack, const char *needle);
功能:从haystack指向的字符串中 查找第一次出现needle指向的字符串的地址
7、memset函数
#include <string.h>
void *memset(void *s, int c, size_t n);
功能:从s地址开始填充n个字节的字符c
主要用去清空内存:
char *p=(char *)malloc(128);//malloc申请的堆区空间默认内容不确定
//清空内存
memset(p,0,128);//将p指向堆区空间中128个字节分别填充为0
8、memcpy内存拷贝
#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
功能:将src指向的空间的n字节 拷贝到dest指向的空间中
9、字符串切割函数
字符串:"hehehe:xixixixi:hahaahaha:heiheiheihei:lalalala"
#include <string.h>
char *strtok(char *str, const char *delim);
功能:将str指向的字符串 安装delim指向的切割符号 进行字符串切割
返回值:
成功返回 切割到的子串的首元素地址
失败:返回NULL
注意:
1、strtok调用一次只能切割一个字符串
2、第一次调用strtok时候 str必须指向被切割的字符串
3、后续的切割 str必须传NULL
4、str指向空间 必须可读可写
切割一式:
#include <stdio.h>
#include <string.h>
void test01()
{
char str[] = "hehehe::::::xixixixi#hahaahaha!heiheiheihei:lalalala";
char *arr[32] = {NULL};
// 第一次:切割字符串
int i = 0;
arr[i] = strtok(str, ":#!");
// 以后次数(前一次切割正常 才能进行下一次切割)
while (arr[i] != NULL) // 前一次切割正常
{
i++;
arr[i] = strtok(NULL, ":#!");
}
//遍历字串
i=0;
while(arr[i])
{
printf("%s\n",arr[i++]);
}
}
切割二式:
#include <string.h>
void test01()
{
char str[] = "hehehe::::::xixixixi#hahaahaha!heiheiheihei:lalalala";
char *arr[32] = {str};
// 第一次:切割字符串
int i = 0;
// 以后次数(前一次切割正常 才能进行下一次切割)
while (arr[i] = strtok(arr[i], ":#!")) // 前一次切割正常
{
i++;
}
//遍历字串
i=0;
while(arr[i])
{
printf("%s\n",arr[i++]);
}
切割三式:
#include <string.h>
void test01()
{
char str[] = "hehehe::::::xixixixi#hahaahaha!heiheiheihei:lalalala";
char *arr[32] = {str};
// 第一次:切割字符串
int i = 0;
// 以后次数(前一次切割正常 才能进行下一次切割)
while ((arr[i] = strtok(arr[i], ":#!")) && ++i);
//遍历字串
i=0;
while(arr[i])
{
printf("%s\n",arr[i++]);
}
}