字符函数和字符串函数

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
",str2);
    strcpy(str3,"world");   //str2和str3:是将“world”字符复制到它们所指向的内存
    printf("%s
",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',...,''};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>字符数组与字符串的区别在于是不是以''结尾。
原文地址:https://www.cnblogs.com/zhoutian220/p/4000076.html