字符函数和字符串函数

/————————————字符函数和字符串函数
本章重点介绍处理字符和字符串的库函数的使用和注意事项
求字符串长度
strlen
长度不受限制的字符串函数
1.strcpy
2.strcat
3.strcmp
长度受限制的字符串函数介绍
1.strncpy
2.strncat
3.strncmp
字符串查找
strstr
strtok
错误信息报告
strerror
字符操作
内存操作函数
1.memcpy
2.memmove
3.memset
4.memcmp
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在
常量字符串 中或者 字符数组 中。
字符串常量 适用于那些对它不做修改的字符串函数
——————1.函数介绍
strlen(计算字符串长度)——>头文件:<string.h>
字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
含 '\0' )。
1.参数指向的字符串必须要以 '\0' 结束。
2.注意函数的返回值为size_t(等同于unsigned int),是无符号的( 易错 )
3.学会strlen函数的模拟实现
--1(参数的规定)
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//    char arr[] = "abcdef";//字符串的末尾会隐藏一个'\0',即初始化时数组内部包括\0,
//    //但是strlen计算字符串长度时,不包括\0,返回的是\0之前的字符个数(字符串中的叫字符,数组中的叫元素)
//    char a[] = {'a','b','c','d'};//数组a,内部不包括\0
//    int i = strlen(arr);//结果为6
//    int j = strlen(a);//随机值(此代码无意义),所以当我们给strlen函数传数组或字符串时一定要包含\0,否则无意义
//    printf("%d  %d",i,j);
//    return 0;
//}
//--2(返回值的运用)
//#include<stdio.h>
//int main()
//{
//    if (strlen("abc") - strlen("abcdef") > 0)//若需要strlen进行计算时,尽量使用比较大小,而不是差值
//    {                      //若非要使用差值,就先将strlen的返回值强制类型转化为int而不是unsigned int
//        printf(">");//此处一定会打印“>”,因为strlen计算的是无符号整型,所以两个strlen相减结果为:-3
//    }//但是内存中存放的是补码,-3的补码为11111111 11111111 11111111 11111101(补码=原码符号位不变按位取反+1)
//    //值为4,294,967,293所以strlen计算时一定要考虑好如何正确使用
//    else
//    {
//        printf("<=");
//    }
//
//    return 0;
//}
--3(模拟实现strlen->my_strlen)
//#include <stdio.h>
//#include<assert.h>
//size_t my_strlen(const char* a1)//my_strlen只负责a1字符串的长度,不会改变字符串的内容,
//{                               //所以+const来限制a1所指向的内容不能修改
//    //此部分必然会对a1所指向的字符串的内容进行访问,即我们对a1进行解引用,而解引用时,str必须是一个有效的指针,
//    // 所以a1不可以为空指针,所以使用断言(assert)即assert(a1),这样就可以保证我们的指针是有效的
//    int count = 0;//计数作用
//    while(*a1 != '\0')//判断*a1是否为有效字符
//    {
//        count++;
//        a1++;//此时a表示首字符地址,++为向后一位一位的移动,并且count也会增加,来计算字符串长度
//    }
//    return count;//
//}
//int main()
//{
//    const char* a1 = "abcdef";
//    size_t n=my_strlen(a1);//实际上传给函数的是首字符的地址
//    printf("%u\n",n);
//    return 0;
//}
strcpy(string copy:拷贝)——>头文件:<string.h>
//————char* strcpy(char* destination,const char* source)//括号里为两个地址
//destination目的地  source源头,把源头的数据拷贝放到目的地的空间里去,\0也拷贝过去
1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变(考虑字符常量与变量)。
5.学会模拟实现。
注意:
1)若目的地name字符串内包含\0(无论任何位置)时,都不会影响拷贝和打印的结果
2)先遇到哪个\0就在哪里停止,此时的\0也不打印,后续的不再打印
3)若源字符串必须以 '\0' 结束,即目的地为无‘\0’的数组时,拷贝后打印会报错,因为打印不会停止并越界
4)若目的地空间小于源头数据的空间(拷贝的内容的空间),虽然拷贝过去了,但是系统崩溃了
5)若拷贝的内容strcpy中(例如:strcpy(name,"abce\0ef"))源头的数据中含有‘\0’时,
从左向右,依次拷贝遇到的第一个‘\0’之前的所有内容,包括‘\0’.
1.2.3


//1.2.3.1).2).3).4)
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//    char name[20] = {'a','c'};//1
//    //char a[] = {'a','b'};//3)此字符数组中无‘\0’所以会越界,此代码有问题
//    //char b[3] = "s";//4)目的地空间小于源头数据的空间,此代码有问题
//    char c[20] = "abcdef";
//    //把“KK”拷贝放到name里去
//    strcpy(name,"KK");
//    //strcpy(a, "KK");
//    //strcpy(b, "KK");
//    strcpy(c, "\0KK\0");//5)strcpy拷贝时,会将\0也拷贝过去,虽然打印时不会打印出来(从左至右遇到第一个‘\0’就停止拷贝)
//    //name="KK";//4)此代码中name是地址(地址是常量值,不能修改,被赋值),并不是空间。因此赋值方法不可行
//    //因为我们对一个变量进行赋值时,原理是把一个数据放到变量的空间里面去
//    printf("%s\n",name);
//    //printf("%s\n", a);//此代码有问题
//    //printf("%s\n", b);//此代码有问题
//    printf("%s\n", c);
//    return 0;
//}


4.目标空间必须可变(考虑字符常量与变量)。
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//    const char *p = "abcdef";//若此处为常量字符串(char *p="abcdef";字符为常量),则不可修改
//    char arr[] = "bit";//而当此处为数组(char p[]="abcdef";字符为变量),可以修改
//    strcpy(p,arr);
//    printf("%s\n",p);
//    return 0;
//}


5.学会模拟实现
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//char* my_strcpy(char* dest, const char* src)
//{
//    char* ret = dest;//dest表示首字符地址
//    assert(dest&&src);
//    while (*dest++=*src++)
//        ;
//    return ret;
//}
//int main()
//{
//    char arr1[] = "abcdef";
//    char arr2[20] = {0};//arr1与arr2都未标注下标大小,所以源头数据应标注大于arr1的下标数,以免越界
//    printf("%s\n", my_strcpy(arr2, arr1));
//    return 0;
//}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值