C语言学习006-最重要的指针02

181 阅读5分钟

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个元素数组的指针