1、获取字符串长度
头文件:#include<string.h>
函数的定义:size_t strlen(const char *s)
函数功能:
测字符指针s指向的字符串中字符的个数,不包括"\0"
返回值:字符串中字符个数
int main(int argc, char *argv[])
{
//使用strlen函数获取字符串的长度
//注意:遇到\0时结束
char S1[20] = "hello";
printf("S1_len = %d\n",strlen(S1));
//使用sizeof函数获取数组内存长度
printf("S1_size = %d\n",sizeof(S1));
return 0;
}
执行结果
S1_len = 5
S1_size = 20
2、字符串拷贝函数
头文件:#include<string.h>
函数的定义:char *strcpy(char *dest, const char *src)
函数说明:
拷贝src指向的字符串到dest指针指向的内存中,"\0"也会拷贝
函数的返回值:
目的内存的地址
注意:在使用次函数的时候,必须保证dest指向的内存空间足够大,否则会出现内存污染
函数的定义:char *strncpy(char *dest, const char *src,size_t n)
函数的说明:
将src指向的字符串前n个字节,拷贝到dest指向的内存中
返回值:
目的内存的首地址
注意:
1、strcpy不拷贝"\0"
2、如果n大于src指向的字符串中的字符个数,则在dest后面填充n-strlen(src)个"\0"
int main(int argc, char *argv[])
{
//使用strcpy函数拷贝字符串
char S1[20] = "hello";
char S2[20] = "world";
strcpy(S1,S2);
printf("S1 = %d\n",S1);
return 0;
}
执行结果
S1 = world
3、字符串追加函数
头文件:#include<string.h>
函数定义: char *strcat(char *dest,const char *src)
函数功能:
strcat函数追加src字符串到dest指向的字符串的后面。追加的时候会追加"\0"
注意:保证dest指向的内存空间足够大
函数定义: char *strncat(char *dest,const char *src,size_t n)
函数功能:
追加src指向的字符串的前n个字符,到dest指向的字符串的后面
注意:
如果n大于src的字符个数,则只将src字符串追加到dest指向的字符串的后面,追加的时候会追加"\0"
int main(int argc, char *argv[])
{
//使用strcat函数追加字符串
char S1[20] = "hello";
char S2[20] = "world";
//strcat是从S1的\0的位置追加,直到S2的\0复制完毕后结束
strcat(S1,S2);
printf("S1 = %d\n",S1);
return 0;
}
执行结果
S1 = helloworld
4、字符串比较函数
头文件:#include<string.h>
函数定义:int strcmp(const char *S1,const char *S2)
函数说明:
比较S1和S2指向的字符串的大小
比较的方法:逐个字符去比较ascll码,一旦比较出大小则返回。如果所有字符都一样,则返回0
返回值:
如果S1指向的字符串大于S2指向的字符串 返回1
如果S1指向的字符串小于S2指向的字符串 返回-1
如果相等的话返回0
函数定义:int strncmp(const char *s1,const char *s2,size_t n)
函数说明:比较S1和S2指向的字符串的前n个字符
int main(int argc, char *argv[])
{
char S1[] = "hello";
char S2[] = "world";
int ret = strcmp(S1,S2);
if(ret == 0)
{
printf("S1 = S2\n");
}
else if(ret > 0)
{
printf("S1 > S2\n");
}
else
{
printf("S1 < S2\n");
}
return 0;
}
执行结果
S1 < S2
5、字符查找函数
头文件:#include<string.h>
函数定义:char *strchr(const char *s,int c)
函数说明:
在字符指针s指向的字符串中,找到ascll码为c的字符
注意:是首次匹配,如果说s指向的字符串中有多个ASCLL为c的字符,则找的是第1个字符
返回值:
找到了返回找到的字符的地址
找不到返回NULL
函数定义:char *strrchr(const char *s,int c)
函数的说明:末次匹配
在s指向的字符串中,找最后一次出现的ASCLL为c的字符
返回值:
末次匹配的字符的地址
int main(int argc, char *argv[])
{
//使用strcat函数追加字符串
char S[] = "helloj worldj";
char *ret = strchr(S,'j');
if(ret == NULL)
{
printf("没有\n");
}
else
{
printf("在第%d个位置\n",ret - S);
}
return 0;
}
执行结果
在第5个位置
6、字符串匹配函数
头文件:#include<string.h>
函数定义:char *strstr(const char *haystack,const char *needle)
函数说明:
在haystack指向的字符串中查找needle指向的字符串,也是首次匹配
返回值:
找到了:返回的字符串的首地址
没找到:返回NULL
int main(int argc, char *argv[])
{
//使用strstr函数在一个字符串中查找另一个字符串
char S[] = "123456789";
char *ret = strstr(S,"56");
if(ret == NULL)
{
printf("没找到\n");
}
else
{
printf("在第%d个位置\n",ret - S);
}
return 0;
}
执行结果
在第4个位置
7、字符串转换数值
atoi/atol/atof
头文件:#include<stdlib.h>
函数的定义:int atoi(const char *nptr)
函数的功能:
将nptr指向的字符串转换成整数,返回
int main(int argc, char *argv[])
{
//使用atoi将数字型字符串转化为整形数据
char S[] = "123456789";
int *ret = atoi(S);
printf("ret = %d\n",ret);
return 0;
}
执行结果
ret = 123456789
8、字符串切割函数
头文件:#include<string.h>
函数定义:char *strtok(char *str,const char *delim)
函数功能:
字符串切割,按照delim指向的字符串中的字符,切割str指向的字符串。其实就是在str指向的字符串中发现了delim字符串中的字符,就将其变成"\0",调用一次strtok只切割一次,切割一次之后,再去切割的时候strtok的第一个参数传NULL,意思是接着上次切割的位置继续切
注意:如果str字符串中出现了连续的几个delim中的字符,则只将第一个字符变成"\0"
int main(int argc, char *argv[])
{
//使用strtok函数切割字符串
char S[] = "123:456:789";
char *ret;
ret = strtok(S,":")
printf("ret = %s\n",ret);
return 0;
}
执行结果
ret = 123
9、格式化字符串操作函数
int sprintf(char *buf,const char *format,…) //输出到buf指定的内存区域
int sscanf(const char *buf,const char *format,…)
int main(int argc, char *argv[])
{
//sprintf和sscanf的基本用法
char buf[20];
int a,b,c;
sprintf(buf,"%d:%d:%d",2020,9,9);
printf("buf = %s\n",buf);
sscanf("2020:9:9","%d:%d:%d",&a,&b,&c);
printf("a = %d,b = %d,c = %d\n",a,b,c);
return 0;
}
执行结果
buf = 2020:9:9
a = 2020,b = 9,c = 9
10、const
(1) 修饰普通变量,代表只读的意思
const int a = 100;//定义了一个只读变量a值为100
以后程序中,不能再给a赋值了
(2) const 修饰指针
const char *str
意思是str指向的内存的内容不能通过str来修饰
用来保护str指向的内存的内容
但是str的指向是可以改变的
char *strcpy(char *dest,const char *str)
如果const修饰指针变量的类型,无法通过指针变量修改地址里面的值 const int * p
如果const修饰指针变量,无法修改指针变量保存的地址 int * const p
如果const既修饰指针变量的类型,又修饰指针变量,则只能通过原本修改值 const int * const p