字符函数和字符串函数
1.ctype.h系列字符函数
ctype.h的字符判断函数
函数名 为如下参数时,返回值为真
isalnum() 字母或数字
isalpha() 字母
iscntrl() 控制符,如ctrl+B
isdigit() 阿拉伯数字
isgraph() 除空格外的所有可打印字符
islower() 小写字母
isprint() 可打印字符
ispunct() 标点符号(除字母空格数字外的可打印字符)
isspace() 空白字符:空格,换行,走纸,回车,垂直制表符,水平制表符,或是其他实现定义的字符
isupper() 大写字母
isxdigit() 十六进制数字字符
ctype.h的字符映射函数
函数名 动作
tolower() 如参数是大写字符,返回相应的小写字符;否则,返回原始参数
toupper() 如参数是小写字符,返回相应的大写字符;否则,返回原始参数
映射函数不改变原始参数,只返回改变后的值。
2.字符串函数(string.h)
<1>char *strcpy(char *s1,const char *s2);char *strncpy(char *s1,const char *s2,size-t n); //把s2指向的字符串(包括空字符),复制到s1指向的位置,返回值为s1。n表示复制的字数不超过n。作用等价于赋值运算符,并不是简单复制字符串的地址。 <2>char *strcat(char *s1,const char *s2);char *strncat(char *s1,const char *s2,size-t n); //s2指向的字符串被复制到s1指向字符串的结尾 <3>int strcmp(const char *s1,const char *s2);int strncmp(const char *s1,const char *s2,size-t n); //字符串比较,返回值为正数,0和负数,遇见空字符后停止比较。n表示最多比较n个字符 <4>char *strchr(const char *s,int c);char *strrchr(const char *s,int c); //返回指向s中存放字符c的第一个位置的指针,若没有找到则返回null。返回指向s中最后一次出现c的地方的指针 <5>char *strpbrk(const char *s1,const char *s2); //返回指向s1中存放s2中任何字符的第一个位置的地址 <6>char *strstr(const char *s1,const char *s2); //返回指向s1中第一次出现s2字符串的地方的指针 <7>size-t strlen(const char *s); //返回s中字符的个数,不包括标志结束的字符。
注意:
<1>strlen()以字符为单位给出字符串的长度。sizeof运算符以字节为单位给出数据的大小。
<2>strcpy和strcat函数的第一个参数应是字符数组或开辟了存储空间的字符指针;gets(),fgets()的参数也是如此。
char *str;strcpy(str,"hello world");问题:str没有被初始化,因此这个字符串可能被复制到任何地方!如果str已经被初始化,也不能执行成功;
给str分配存储空间:str=(char *)malloc(20),能成功执行
声明一个数组将为数据分配存储空间;而声明一个指针只为一个地址分配存储空间。
int main (int argc, char **argv) { char *str1; char *str2; char str3[20]; str1 = "hello"; str2 = (char*)malloc(20); strcpy(str2,"world"); printf("%s\n",str2); strcpy(str3,"world"); //str2和str3:是将“world”字符复制到它们所指向的内存 printf("%s\n",str2); strcpy(str1,"world");//在这里出现段错误,str1指向的“hello”不能被修改 return 0; } /* ----- End of main() ----- */
运行结果:
world
world
段错误 (core dumped)
3,字符串数组初始化与赋值:
<1>初始化:char a[]="hello word!"; char b[]={'h','l','l','o',...,'\0'};char *c="hello world!";
数组初始化是从静态存储区把一个字符串复制给数组,而指针初始化是复制字符串的地址。
数组名a,b是常量(不可被赋值),指针c是变量;两者都可以使用数组符号a[3]和指针加法*(a+3),但只有指针可以使用增量运算符c++
<2>赋值:strcpy(a,"haha"); c="haha";(只是简单的复制指针)
<3>字符串数组:char *a[]={"hello world!","hello world!"};a数组存放的是字符串的地址。相当于不规则的二维数组。
<4>字符数组与字符串的区别在于是不是以'\0'结尾。