不举步,越不过栅栏,不迈腿,登不上高山。
测量字符串长度
概述
测量字符指针指向的字符串中字符的个数,不包括'\0'
语法
strlen(char *)
返回值:字符串中字符个数
示例
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char *s = "hello";
char s1[20] = "hello";
printf("%d\n",strlen(s));
printf("%d\n",sizeof(s1));
printf("%d\n",sizeof(s));
return 0;
}
sizeof是个关键字,测量数据的占用内存空间大小
如果测量的是数组名字,则测的是数组占多少个字节
如果sizeof测的是指针变量,则测的是指针变量本身占几个字节,32平台下显示结果是4
strlen是个库函数,测量的是指针指向的字符串的个数,不管指针是数组名字还是指针变量
字符串拷贝函数
语法
char *strcpy(char *dest,char *src);
概述
拷贝src指向的字符串到dest指针指向的内存中,'\0'也会拷贝
返回值
目的内存的地址
注意:
在使用此函数时,必须保证新的指向的内存空间足够大,否则会出现内存污染
语法
char *strncpy(char *dest,char *src,n);
概述
将src指向的字符串前n个字节,拷贝到dest指向的内存中
返回值
目的内存的首地址
注意:
1.strncpy不拷贝'\0'
2.如果n大于src指向的字符串中字符的个数,则在dest后面填充 n - strlen(src)个'\0'
示例
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char buf[100]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
strncpy(buf,"helloworld",5);
printf("%s\n",buf);
return 0;
}
结果为 helloaaaaaaaaaaaaaaaaaaaaaaaa。验证不拷贝'\0'
字符串追加函数
语法
char *strcat(char *dest,char *src);
概述
strcat函数追加src字符串到dest指向的字符串的后面。追加的时候会追加’\0‘
注意:要保证dest指向的内存空间足够大
void fun01()
{
char *p = "world";
char str[20] ="hello\0jjjjjjjjjj";
strcat(str,p);
printf("%s\n",str); //追加字符串的时候会追加'\0'
}
语法
char *strncat(char *dest,char *src,n)
概念
追加src指向的字符串的前n个字符,到dest指向的字符串的后面
注意如果n大于src的字符个数,则只将src字符串追加到dest指向的字符串的后面追加的时候会追加'\0'
void fun01()
{
char *p = "world";
char str[20] ="hello";
strncat(str,p,3);
printf("%s\n",str);
}
判断字符串大小是否相等
strcmp/strncmp区别
定义
int strcmp(char *sl,char *s2);
概述
比较s1与s2指向的字符串大小
比较方法:逐个字符比较ascll码,比较出大小时返回
如果所有字符都一样,则返回0
返回值:
如果s1指向的字符串大于s2指向的字符串 返回值大于0
如果s1指向的字符串小于s2指向的字符串 返回值小于0
如果相等返回0
语法
int strncmp(char *s1,char *s2,n);
概述
比较s1和s2指向的字符串中前n个字符
void fun02()
{
char *p = "hello world";
char *g = "hello world";
printf("%d\n",strncmp(g,p,5));
}
字符查找函数
语法
char *strchr(char *s,int c)
概述
在字符指针s指向的字符串中,找到ascll码为c的字符
注意
首次匹配,当s指向的字符串中有多个ascll为c的字符,则返回的是第一个字符的返回值
返回值:
返回找到的字符的地址
找不到时返回NULL
语法
char *strrchr(char *s,int c);
概述
在s指向的字符串中,找到最后一次出现ascll为c的字符
返回值
末次匹配的字符的地址
字符串匹配函数
语法
char *strstr(char *hay, char *nee);
概述
首次匹配时在hay指向的字符串中查找nee指向的字符串
返回值
找到时返回字符串的首地址
没找到时返回NULL
void fun02()
{
char *p = "hello world";
char *g = "hello";
printf("%p\n",strstr(p,g));
}
字符串转换数值
atoi 转换为整型
atol 转换为长整型
atof 转换为浮点型
语法
int atoi(char *npt);
概述
将 npt指向的字符串转换成整数返回
示例
void fun03()
{
int num =atoi("123");
printf("%d\n",num);
}
字符串切割函数
语法
char *strtok(char *str,char *deli);
概述
字符串切割,按照deli指向的字符串中的字符,切割str指向的字符串。其实就是在str指向的字符串中发现deli字符串中的字符,将其变为'\0'。调用一次strtok只切割一次,切割一次之后,在切割的时候strtok的第一个参数为NULL,意思是接着上次切割的位置继续切
注意
如果str字符串中出现了连续的几个deli中的字符,则将第一个字符变成’\0‘
void fun04()
{
char s[] = "123,,,...456##..789,,..";
char *buf[3] = {s,NULL};
int i = 0;
char *p = ",.#";
while(1)
{
buf[i] = strtok(buf[i],p);
if (buf[i] == NULL)
{
break;
}
i++;
}
for (int i = 0; i < 3; i++)
{
printf("%s\n",buf[i]);
}
}
格式化字符串操作函数
int sprintf(char *buf,char *format,...)
概述
输出到buf指定的内存区域
示例
void fun05()
{
char p[20];
sprintf(p,"%d/%d/%d",2023,11,6);
printf("%s\n",p);
}
语法
int sscanf(char *buf,char *format,...);
概述
从buf指定的内存区域中读取信息
示例
void fun05()
{
int a, b, c;
sscanf("2023:11:6", "%d:%d:%d", &a, &b, &c);
printf("%d %d %d\n",a,b,c);
}
sscanf高级用法
1.跳过数据:%*s或%*d
示例
void fun05()
{
char p[20];
sscanf("123 567","%*d %s",p);
printf("%s\n",p);
}
2.读取指定宽度的数据
示例
void fun05()
{
char p[20];
sscanf("123567","%5s",p);
printf("%s\n",p);
}
3.支持集合操作,但只支持获取字符串
%[a-z] 表示匹配a到z中任意字符
void fun05()
{
char p[20];
sscanf("agcdaDjf32DdFF","%[a-z]",p);
printf("%s\n",p);
}
扩展
%[aBc]匹配a,B,c中的一员,贪婪性
%[^aFc] 匹配不是a,F,c的任意字符
%[^a-z] 匹配a-z以外的任意字符