关于字符串库函数的学习

一.strcpy(字符串复制函数)
函数介绍:char* strcpy(char * destination,const char * source)

我们称 destination为目标空间 source称为源字符串;

strcpy()函数将源字符串拷贝到目标空间;

注意:
1. 源字符串必须以'\0'结束。
2·会将源字符串中的'\0'拷贝到目标空间。
3·目标空间必须足够大,以确保能存放源字符串。·目标空间必须可变。
4·学会模拟实现.

错误示范:
1.arr1中没有结束标志'\0';所以在拷贝时出现错误,由于没有结束标志'\0'他会一直向后拷贝找\0;
char arr[]="asdfg";
char arr1[]={'b','i','t'};
2.当源字符串大小大于目标字符串空间时程序会崩溃;
char arr2[]="adf";
char arr3[]="ofdsfsd";
3.目标空间必须可以改变;
char* p="asdsaf";
char arr4[]="dsad";

关于字符指针赋值一个字符串时p中存放的是字符串首字母的地址;该字符串是常字符串;语法规定不能 改变常字符串的内容;

二.strlen(计算字符串长度的函数)

函数介绍:size_t strlen(const char*string);

首先我们要清楚的了解strlen和sizeof的区别和联系;

1.strlen专注于字符串的长度是字符串特有的计算函数;sizeof专注于数据所占内存空间的大小适用于多 种数据类型;

2.strlen是一个库函数,sizeof是一个操作符

体现于strlen(arr)计算arr字符串的长度时()不可以省略;sizeof(arr)计算大小时可以省略();

3.联系:它们都可以计算字符串的长度;strlen(arr),sizeof(arr)-1都表示字符串的长度;

sizeof(arr)减了1是因为sizeof计算时将\0也计算其中导致;
三. strcat(追加字符串)

它与strcpy多处相似
函数介绍:char * strcat ( char * destination,const char * source);

该函数将源字符串加到目标字符串的后面;从目标字符串的'\0'开始加.(覆盖\0)
1.源字符串必须以'\0'结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。目标空间必须可修改。
3.思考:字符串自己给自己追加,如何?
char arr5[30]="abc ";
char arr6[30]="defg";
strcat (arr5,arr6);
printf("%s",arr5);
四.strcmp函数(字符串比较函数)
strcmp用来比较两个字符串是否相等相等时返回0;第一个>第二个时返回1;第一个<第二个时返 回-1;
1.char arr1[20] = "zhangsan";比较的是字符串的内容而不是长度;对应相同位置字符的ASCII码值作 比较
char arr2[] = "zhangsanfeng" ;
2.char arr1[] = "abqdef";
char arr2[] = "abc" ;
两个字符串比较相等,应该使用strcmp

五.受限制的字符串函数
strcpy,strcat,strcmp是长度不受限制的字符串函数

不受限制就说明他是危险不可控的;

例如:
char arr3[4] ={0};
strcpy(arr3,"hello bit");
printf("%s\n", arr);

这里的源字符串放入目标空间时 空间是不够的会形成越界访问但是它任然可以被放进去,说明arr3的空间被改掉了(它擅自改掉了我们开辟的内存空间),运行时程序会崩溃;

strncpy,strncat,strncmp是长度受限制的字符串函数;

函数介绍:char *strncpy( char *strDest, const char *strSource, size_t count );
想要拷贝几个字符就添加参数n;
char arr1[20] ="abcdef";
char arr2[] ="hello bit";
strcpy(arr1, arr2);
strncpy(arr1,arr2,5); 如果源字符串有3个字符使用strncpy函数时想要拷贝5个字符 他会拷贝三 个后后面补充\0到第五个字符:bit\0\0;
printf("%s \n", arr1);

strncat
char arr1[20] = "hello";
char arr2[] ="world";
strncat(arr1, arr2,3);
printf("%s",arr1);
追加几个字符串就添加参数n个;但是在追加完成n个之后最后会自动补充一个\0;作为结束的标志; 注意:使用该函数之后目标字符串最后的结束标志'\0'是追加过来的;
char arr1[20] = "hello\0xxxxXx";
char arr2[] = "uiu";
strncat(arr1, arr2,6); 这里只有3个字符uiu但是要求追加6个字符串 不会像strncpy一样给他后面加\0;追加3个之后就结束;
strncmp函数;
char arr1[] = "abcdef";
char arr2[] = "abc";
int ret = strncmp(arr1,arr2,3); 想要比较几个字符就给函数一个n 的参数;
if(ret == 0)
printf("==\n");
else if (ret< 0)
printf("<\n");
else
printf(">\n");

六.strstr函数(在字符串里找子串);

函数介绍:char*strstr(const char*string,const char*strCharSet);

可以找到返回值是字符串里子串的起始位置;找不到返回NULL;

char a[] = "abcdefg";

char b[] = "abc";

char* ret = strstr(a,b);

if (ret == NULL)

{

printf("子串不存在\n");

}

else

{

printf("%s\n", ret);

}

情况1:abcdef里找abc;(easy)

情况2:abbbcdef里找bbc;

七.strtok函数(字符串分割函数)

函数介绍:char* strtok(char*strToken,const char*strDelimit);

分割函数它可以将字符串分割成我们想要的字符串 函数传参时传目标字符串的地址和分割字符的字符串集合;

const char* sep = "@."; 这里的@和.就是他的分割标志符号;在目标字符串中找到 @将他改成'\0'后返回起始地址;

char email[] = "shizhongxi@qq.com" ;

char cp[30] ={0};

strcpy(cp,email); 因为我们在使用strtok函数时会改变目标函数本身;所以在使用时可以新建一个字符 串空间拷贝过去再用;

char* ret = strtok(cp,sep);

printf("%s\n", ret);

ret = strtok(NULL, sep); 第一次传目标字符串地址;第二次第三次传 NULL看到空指针系统就知道了在 上次切割后的字符串的基础上继续切割;

printf("%s\n", ret);

ret = strtok(NULL,sep); 最后得到三段字符串;

printf("%s\n", ret);

strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

八.strerror(错误码信息返回函数)

每一个错误码都代表着一种库函数调用失败的错误信息;

printf( "%s \n", strerror(0));

printf( "%s \n", strerror(1));

printf( "%s \n", strerror(2));

printf("%s in", strerror(3));

printf("%s \n", strerror(4));

printf( "%s \n", strerror(5))

errno - C语言设置的一个全局的错误码存放的变量

errno.h是包含errno的头文件;

FILE* pf = fopen( "test.txt", "r"); fopen是一个打开文件的函数打开test.txt文件以ride的形式;如果 文件不存在 则打开失败返回一个错误码放在全局变量errno里;

if (pf == NULL) //pf是空指针说明打开失败;

{

printf("%s \n", strerror(errno)); 这里我们可以通过函数strerror来看错误的原因; 注意:errno存放 最新的错误码;

return 1;

}

九.字符分类函数

包含于头文件 ctype.h;

如果他的参数符合下列条件就返回真(非0数) 不符合则返回0;

iscntrl 任何控制字符

isspace 空白字符:空格'',换页\f,换行'\n',回车'\r',制表符'\t'或者垂直制表符'\v'

isdigit 十进制数字0~9

isxdigit 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F

islower 小写字母a~z

isupper 大写字母A~Z

isalpha 字母a~z或A~Z

isalnum 字母或者数字,a~z,A~Z,0~9

ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)

isgraph 任何图形字符

isprint 任何可打印字符,包括图形字符和空白字符*/

//字符转换:

int tolower( int );//大写字母转小写 //(int)表示字符的阿斯克码值;

int toupper( int );//小写字母转大写 //如果给的不是大小写字符而是特殊字符不改变;

}

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值