C和指针(学习笔记)_第9章 字符串、字符和字节

       字符串是一种重要的数据类型,但在C语言中并没有显式的字符串数据类型,因为字符串以字符串常量的形式出或者存储于字符数组中。字符串常量很适用于那些程序不会对它们进行修改的字符串。所有其他字符串都必须存储于字符数组或动态分配的内存中。

1.字符串基础

        字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。因此字符串所包含的字符内部不能出现NUL字节。头文件string.h包含了使用字符串函数所需的原型和声明。

2.字符串长度

        字符串长度就是它所包含的字符个数。函数库原型:size_t strlen(char const *string);

//计算字符串参数的长度
#include<stddef.h>

size_t strlen(char const *string){
    int length;
    for(length=0;*string++!='\0';)
        length+=1;
    return length;
}

3.不受限制的字符串函数

        1)复制字符串:char *strcpy(char *dst,char const *src);  程序员必须保证目标字符数组的空间足以容纳需要复制的字符串。如果字符串比数组长,多余的字符仍被复制,它们将覆盖原型存储于数组后面的内存空间的值

        2)连接字符串:char *strcat(char *dst,char const *src);  src字符串添加到dst字符串后面,程序员必须保证目标字符数组剩余的空间足以保存整个源字符串。

       3)函数的返回值:strcpy和strcat都返回它们第1个参数的一份拷贝,就是一个指向目标字符数组的指针。

       4)字符串比较:int strcmp(char const *s1,char const *s2); 注意标准并没规定用于提示不相等的具体值,它只是说如果第1个字符串大于第2个字符串就返回一个大于零的值,如果第1个字符串小于第2个字符串就返回一个小于零的值,相等返回零值。由于strcmp并不会修改它的任何一个参数,所以不存在溢出字符数组的危险。

4.长度受限的字符串函数

char *strncpy(char *dst,char const *src,size_t len);
char *strncat(char *dst,char const *src,size_t len);
int strncmp(char const *s1,char const *s2,size_t len);

5.字符串查找基础

      1)查找一个字符

char *strchr(char const *str,int ch);
char *strrchr(char const *str,int ch);

     2)查找任何几个字符:char *strpbrk(char const *str,char const *group);

     3)查找一个子串:char *strstr(char const *s1,char const *s2);

6.高级字符串查找

      1)查找一个字符串前缀

size_t strspn(char const *str,char const *group);
size_t strcspn(char const *str,char const *group);

     2)查找标记:char *strtok(char *str,char const *sep);

7.错误信息

     char *strerror(int error number);

8.字符串操作

iscntrl   任何控制字符
isspace   空白字符:空格''等
isdigit   十进制数字0~9
isxdigit  十六进制数字
islower   小写字母a~z
isupper   大写字符A~Z
isalpha   字母
isalnum   字母或数字
ispunct   标定符号
isgrap    任何图像字符
isprint   任何可打印字符

int tolower(int ch);//大写转小写
int toupper(int ch);//小写转大写

9.内存操作

void *memcpy(void *dst,void const *src,size_t length);
void *memmove(void *dst,void const *src,size_t length);
void *memcmp(void const *dst,void const *src,size_t length);
void *memchr(void const *dst,int ch,size_t length);
void *memset(void *dst,int ch,size_t length);

10.警告的总结

      1)应该使用有符号数的表达式中使用strlen函数;

      2)在表达式中混用有符号数和无符号数;

      3)使用strcpy函数把一个字符串复制到一个较短的数组中,导致溢出;

      4)使用strcat函数把一个字符串复杂到一个较短的数组中,导致溢出;

      5)把strcmp函数的返回值当作布尔值进行测试;

      6)把strcmp函数的返回值与1和-1进行比较;

      7)使用并非以NUL直接结尾的字符序列;

      8)使用strncpy函数产生不以NUL字节结尾的字符串;

      9)把strncpy函数和strxxx族函数混用;

      10)忘了strtok函数将会修改它所处理的字符串;

      11)strtok函数是不可再入的(是指函数在连续几次调用中,即使它们的参数相同,其结果也可能不同);

11.编程提示总结

       1)不要试图自己编写功能相同的函数来取代库函数;

       2)使用字符分类和转换函数可以提高函数的移植性;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值