1、字符串常用应用模型:
1)利用strstr函数找子字符串while模型和do-while模型
string.h头文件
strstr函数作用:
strstr(p,"字符串") 从头字符串中第一次出现字符串的位置开始从左往右截取 比如: char *p = "12abcdf" strsrt(p,"abcd") = "abcdf",相当于java中先获取abcd的位置,在调用截取函数功能
strlen("字符串") 返回字符串的长度
p + 长度: 相当于从左往右移动长度截取字符串
char *p = "abcd12" p+strlen("abcd") = "12"
利用上方两个函数可以实现两个模型:
while ((p = strsrt(p,"abcd")) != NULL){
p = p + strlen("abcd");
n++;
if(*p == 0){
//这里防止字符串"abcd"的出现,第一次后*p就是0字符了,到了末尾了
break;
}
}
do-while模型和上面的while类似
2)两头堵模型:
begin = 0 ; end = strlen(p) - 1;
去掉两边空字符''的元素的个数: 从左往右先 p[begin] == '' and p[begin] != '0' begin++ 从右往左 p[end] == '' and end > 0 end-- 然后中间的个数就是 end - begin + 1;
3)、字符串反转模型:
begin = 0 end = strlen(p)- 1,然后设置tmp临时变量,循环调换两个位置的元素就行
while begin < end就行
2、字符串常用处理函数,需要头文件 string.h
1)strcpy(char *desc,char *src) 将src字符串赋值到desc中 末尾的0也会赋值
目标字符串必须是字符数组形式,被复制的字符数组和指针类型的都行
结果:目标数组会被完全覆盖掉,
2)strncpy(char *des,char *src,int) : 在(1)的基础上将前n个字符赋值
注意点和上面的一样,但是结果不一样,结果只会替换目标字符串中的前n个字符
3)strcat(char *des,char *sr) 将sr拼接到des的末尾,0也会拿过去 注意点:和上面的注意点一样,同时目标数组要指定长度,不然长度不够拼接的结果
4)strncat(char *des,char *sr,n):和上面的一样,只不过是拼接前几个字符到目标的结尾
5)strcmp(const char *s1,const char *s2) 比较两个字符串的大小,比较的是ASCII码的大小
结果 %d -1 就是小于 1 就是大于 0就是等于
字符串两种形式都可以写的
6)strncmp(char * s1,char * s2,n)比较前几个字符的大小
7)、sprintf(char *str ,const char * format) 根据参数format来转换和格式化字符串,并将结果输出到str指定的空间中,直到出现结束符0为止。和printf格式化有些相似
char dst[] = {0}
char *ss= "你好"
int len = sprintf(dst,"a=%d,b=%s",10,ss) 结果:dst变成了 a=10,b=你好
字符串必须是数组形式的
8)sscanf(const char *str,const char *format) 从指定字符串读取数据,并根据参数format来转换并格式化数据
是7函数的相反的函数
作用:有一个有格式特点的字符串,用sscanf函数去根据特点去读取多个变量的值
比如:一个字符串:char src[] = "a:200,b:100";
int a;int b
sscanf(src,"a:%d,b:%d",&a,&b) 这样就取到a和b的值了,a是200 b是100
多个参数之间的分隔符也必须一样的,字符串里面是逗号,下面format里面也要是字符串
9)strchr(constr char *s,int c) 从s中查找字母c出现的位置,返回第一次出现的地址
char *p = strchr("12abcd",'a'):%s p = "abcd"
10)strstr(char *s1,char *s2) 上面用过,返回第一次出现子字符串的位置, %s结果是:截取的字符串。
类似9函数,只不过9是字符,10是子字符串
11)strtok() 字符串分割函数
char *p = "abcnulldec"
第一次调用必须要指定分割字符串
strtok(p,"*") 将字符串p根据字符串*分割出来,需要while多次取出
char a[100] = "adcfvcvebcyhghbdfgcasdert";
char s = strtok(a, "");//将""分割的子串取出
while (s != NULL)
{
printf("%s\n", s);
s = strtok(NULL, "");
后期设置成NULL返回指向每个分段的首地址
}
被分割的字符串必须是数组形式的,
【注意】:这里的分割不是以分隔字符整体作为分隔条件的,只要是字符串中出现了分割字符中的任何字符都会被替换成\0,就被分割了。
比如:
an12abcandmmagd : 分割的结果不是:an12abc mmagd
正确的分割结果是:
12
bc
mm
g
12)、转换字符串:将数字开头的字符串转为数字
int atoi(char *str) 跳过前面的空格字符,遇到正负号或者数字才开始转换,遇到非数字或字符串结束0结束:
atoi("uiajf-123fa") = 0 atoi(" -12.8faf") = -12
其他的:atof : 将小数形式的字符串转为小数 ,遇到小数点不会停止,上面的遇到小数点停止了
atof(" -12.8faf") = -12.8
atol 转为长整型 long型的
3、指针小结:
int i:定义整型变量
int *p 定义一个指向整型的指针变量
int a[10] 定义一个数组,10个元素,每个元素类型为int
int *a[10]定义一个数组,10个元素,每个元素类型为 int *
int func() 定义一个函数,返回类型为 int
int *func() 定义一个函数,返回类型为int *
int **p 定义一个执行整型指针的指针,二级指针
自己补充:
int (*p)[10] 定义一个执行10个元素数组的指针