当前位置:   article > 正文

第十四 函数接口

第十四 函数接口

函数接口:

  1. strcpy 与 strncpy

#include<string,h>

Char *strcpy(char *dest,const char *src); (2401.c)

Char *strncpy(char *dest,const char *src,size_t n);(2402.c)

这两个函数的返回值都是 dest指针

  1. dest与src都是char *型,src所指向的内存空间在函数中只能读不能改写,而dest所指向的内存空间在函数中是要改写的
  2. 两个函数在拷贝字符串时会把结尾的’\0’也拷到dest中,因此保证了dest是以Null结尾的字符串,但这样做存在一个问题,strcpy只知道src字符串的首地址,不知道长度,它会一直拷贝到’\0’,因此dest所指向的内存空间要足够大,否则有可能越界。
  3. n的值就是解决这个问题,如何确保dest以’\0’ 结尾,2402中可以看到

2.Malloc与free

  Void foo(char *str,int n)

{

       Char buf[?]:

       Strncpy(buf,str,n);

       …..

}

N是由参数传进来的,是多大不知道,那么buf要定义多大?这时我们希望动态分配一块全局的内存空间。

每个进程都有一个堆空间,C标准库函数malloc可以在堆空间动态分配内存,它的底层通过brk系统调用向操作系统申请内存,动态分配的内存用完之后可以用free释放,更准确地说是归还给了malloc,下次调用malloc时这块内存可以再次分配出来。

#include<stdlib.h>

Void *malloc(size_t size);(2403.c)

返回值:成功返回所分配的首地址,出错返回NULL

Void free(void *ptr)  

  1. Malloc的参数size表示要分配的字节数,如果分配失败(可能是系统内存耗尽)则返回NULL
  2. 由于malloc不知道拿这块内存放什么类型的数据,所以返回通用指针void*,用户可以转换成其它类型的指针再访问这块内存。
  3. Malloc函数保证它返回的指针所指向的地址满足系统的对齐要求,32位平台上返回的指针一定对齐到4字节边界,以保证用户程序把它转换成任何类型指针都能用。
  4. 传给free的参数正是先前的malloc返回的内存块首地址

2403.c

       1.等号右边是void *类型,等号左边是unit_t *类型,编译器会做隐式类型转换,

2.虽然内存耗尽是很不常见的错误,但写程序要规范,malloc之后应该判断是否成功

3.Free(p),p所指的内存空间是归还了,但是p的值并没有变,因为从free的函数接口来看根本没有改变p的值,p现在指向的内存空间已经不属于用户程序,换句话说,p成了野指针,所以应该在free(p)之后手动置p=NULL

4.应该先free(p->msg),后free(p),顺序不能颠倒,如果先free(p),p成为野指针,就不能再访问p->msg了

给字符串赋初值

#include<string.h >

Void *memset(void *s,int c,size_t n)

返回值:S指向哪,返回的指针就指向哪

Char buf[10];

Memset(buf,0,10)通过这个清零

Memset函数给一段内存(从s所指的地址开始的n个字节)赋初值,把每个字节都填充为C的值,通常高用memset时传给C的值是0,把一块内存区清零。

取字符串的长度

#include<string.h>

Size_t strlen(const char *s)

返回值:字符串的长度

 该函数从S所指的第一个字符开始找’\0’字符,一旦找到就返回的,返回的长度不包括’\0’字符。

 Buf[ ]=”hello”;则strlen(buf)=5

#include <string.h>

Void *memcpy(void *dest,const void *src,size_t n);

 Void *memmove(void *dest,const void *src,size_t n);

返回值:dest指向哪,返回的指针就指向哪

  1. Memcpy 函数从src所指的内存地址拷贝n个字节到dest 所指的内存地址,和strncpy不同,memcpy并不是遇到’\0’就结束,而是一定会拷完n个字节。
  2. Memmove 与memcpy有一点不同,memcpy的两个参数src和dest所指的内存区间如果重合则无法保证正确拷贝,而memmove却可以正确拷贝。

2404.C

  

连接字符串

#include<stdio.h>

 

Char *strcat(char *dest, const char *src)

Char *strncat(char *dest, const char *src,size_t n);
返回值:dest指向哪,返回的指针就指向哪

Strcat把src所指的字符串连接到dest所指的字符后面,缓冲区s的内容没有变,缓冲区d中保存着字符串d中的内容,注意原来的’\0’ 被覆盖,而后面加上来的字符串的’\0’被保留

2505.c

比较字符串

#include<string.h>

Int memcmp(const void *s1,const void *s2,size_t n);

Int strcmp(const void *s1,const void *s2);

Int strncmp(const void *s1,const void *s2,size_t n);

返回值:负值表示s1小于s2,0表示s1等于s2,正值表示s1>s2

1.memcmp从前到后比较缓冲区s1和s2的前n个字节(不管里面有没有’\0’), 负值表示s1小于s2,0表示s1等于s2,正值表示s1>s2

2.strcmp把s1和s2当字符串 比较,在其中一个字符串中遇到’\0’时结束(最后的’\0’也参加比较)

3.Strncmp的比较结束条件:要么在其中一个字符串是遇到’\0’时结束(strcmp),要么比较完n个字符(memcmp)。

搜索字符串

#include<string.h>   2406.c

Char *strchr(const char *s,int c)(在字符串s中从前到后找字符C,找到字符C第一次出现的位置时就返回,返回的指针就指向这个位置,如果找不到,就返回NULL)

Char *strrchr(const char *s,int c)(与strchr一样,只不过是从右往左找)

返回值:如果找到字符C,返回字符串S中指向字符C的指针,如果找不到就返回NULL

#include<string.h>

Char *strstr(const char *haydtack, const char *needle)

返回值:如果找到子串,返回值指向子串的开头,如果找不到就返回NULL

分割字符串

#include <string.h>

Char *strtok(char *str, const char *delim);

参数str是待分配的字符串,delim是分隔符,可以指定一个或多个分隔符,strtok遇到其中任何一个分隔符就会分割字符串

2407.c

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1006927
推荐阅读
相关标签
  

闽ICP备14008679号