C和指针 第九章 字符串和字节
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int length( char * string);
int main()
{
//int p,q;
char a[40] = "AABBCCDDEEFFGGHHII";
char b[10]="ABC";
char c[30]="hi";
int x,y;
x = strspn(a, b);
y = strcspn(a, b);
printf("%d\n",x);
printf("%d\n",y);
/*char * ans;
char * anss;
ans = strchr(a, 'H');
anss = strpbrk (a,"LOW");
char * ansss;
ansss = strstr (a,"LL");
printf("那个strrstr的结果 %c \n",*ans);
printf("那个strchr函数要查找的字符 %c \n",*ans);
printf("那个strpbrk函数查到的在后边一个字符中任意一个和第一个中匹配的字符 %c \n", *anss);*/
/*strcpy(b, a);
strcat(c, a);
printf("把a复制到b并且输出他们看!\n");
printf("把a连接到c并且输出他们看!\n");
puts(a);
puts(b);
puts(c);*/
/*p=strlen( a );
q=length(a);
printf("共有%d个字符\n", p);
printf("自己共有%d个字符\n", q);*/
return 0;
}
int length( char * string)
{
int length;
for(length = 0; *string++ != '\0'; length++)
{
;
}
return length;
}
以上代码是用来测试乱七八糟的一些功能的
1.字符串是一种重要的数据类型 ,但是C没有显式的字符串数据类型,因为字符串以字符串常量(主要适合那种程序不会对他们进行修改的字符串)的形式出现或者存储于字符数组中
本章重点讲的是一些字符串函数的使用,我们老师以前上课时讲的是重点是这些函数的内部具体实现,
9.1 字符串基础
字符串就是一串0/多个字符,并且以一个'\0'结尾,'\0'并不是字符串的一部分,所以字符串长度不包括'\0'
9.2字符串长度
函数原型
size_t strlen( char const *string);
这里书上给了一个警告,我以前没有关注过
size_t 是一个无符号数,
if (strlen (x) >= strlen ( y ) )....
if (strlen (x) -strlen ( y ) >= 0....
第一条语句是按照预想工作的,然而第二条语句的结果永远为真,strlen的结果是个无符号数,所以>=的结果也是无符号数,而无符号数绝不可能是负号的
如果strlen的返回值强制转换我int,就可以消除这个问题
9.3不受限制的字符串函数(只是通过寻找字符串参数结尾的NUL字节来判断长度
9.3.1复制字符串
函数原型
char *strcpy( char *dst, char const *src );
dst是一个字符数组合作一个指向动态分配内存的数组的指针,不能使用字符串常量
目标参数以前的内容将会字典覆盖丢失,如果源串比目标串短,是这样的
目标串以前的存储
a | a | a | a | a |
'\0'
|
加入使用abc去覆盖
a | b | c | '\0' | a | '\0' |
9.3.2连接字符串
就是把一个字符串连接到另外一个字符0串后边,函数原型
char *strcat( char *dst, char const *src );
9.3.3函数的返回值
strcpy和strcat返回的都是第一个参数的拷贝
9.3.4字符串比较
对两个字符串对应字符逐个毕竟,直至发现不匹配。那个不匹配的字符中在字符集中叙述较小的的那个字符所在的字符串被认为是小于另外一个字符串,如果一个字符串是另外一个字符串的子集,那么也是小于他的,函数原型
int strcmp( char const *s1,char const *s2 );
如果s1小于s2返回一个小于0的值,如果s1>s2,返回一个大于0的值(所以这个返回值最好与0比较
9.4长度受限的字符串函数
这些函数接受以显式的用于限制进行复制或者比较的字符数
函数原型:
char *strncpy( char *dst, char *src, size_t_len );
char *strncat( char *dst, char *src, size_t_len);
int strncmp( char const *s1,char *s2,size_t_len);
这里有一点需要注意的:strncpy是向dst写入len个字符,如果strlen(src)<len,dst数组就会使用NUL填充len长度,如>len,那么就是只有len个字符被复制到dst中,注意它的结果将不会以'\0'结尾,说明strncpy调用的结果可能不是一个字符串
strncat也是一个长度受限的函数,它从src最多复制len个字符到目标数组淡定后边,但是它总会在字符串后边添加一个NUL字节,而且他不会像strncpy一样填充,目标数组原先的字符串是算在Len中,而且它不管目标参数除去原先的字符串后留下的空间够不够(这里我觉得len指的是连接完了后所有的字符个数)
9.5字符串查找基础
9.5.1.查找一个字符,函数原型:
char *strchr (char const *str, int ch );//查找ch第一次出现的位置,返回一指向该位置的指针,否则返回NULL
char *strrchr (char const *str, int ch);//返回的是一个指向该字符最后一次出现的位置(最右边的那个)
9.5.2查找任何几个字符
查找任何一组字符在第一次字符串中出现的位置。原型如下:
char *strpbrk( char const *str, char const *group );
返回一个指向str中第一个匹配group中任何一个字符的字符位置,如果没有找到匹配,函数返回一个NULL指针。
9.5.3查找一个子串
函数原型:
char *strstr( char *s1, char const *s2 );
9.6 高级字符串查找
9.6.1查找一个字符串前缀
以下两个函数用于在字符串的起始位置对字符计数:
函数原型://唉,这个我也没有具体去看一下,我感觉好难啊这个,啊啊啊,看了一下代码感觉那个起始处应该就是说从一开头就开始匹配的啊
size_t strspn(char const *str, char const *group);//返回str起始部分匹配group中任意字符的字符数,str下一个字符激素他的第一个非空白字符
size_t strcspn( char const *str, char const *group);//返回一个str字符串起始部分不予group中任何字符匹配的字符进行技术
9.6.2 查找标记
char *strtok( char *str, char const *sep);//sep参数是一个字符串,定义了用作分隔符的字符集合,第一参数指定一个字符串,保护>=0个由sep字符串中一个或者多个分隔符分隔的标记,strtok找到str的下一个标记,将其使用NUL结尾,然后返回一个指向这个标记的指针
如果strtok的第一个参数不是NULL则函数将找到字符串的第一个标记,并保存该位置,如果是NULL则函数就在同一个字符串中从这个被保存的位置开始想前面一样查找下一个标记。如果没有更多标记指针,则返回一个NULL指针,
9.8字符操作
ctype.h头文件里有一些对于单独操作的字符,比如说是判断是不是数字啦,大写啦,小写啦一类、
9.9内存操作
void *memcpy( void *dst, void const *src, size_t_length );
memxxx这类函数可以提供类似字符串函数的能力,但是可以处理'\0',另外,length是论字节的所以有时候需要sizeof()计算
下一篇: 字符串---删除子串(1)