c语言子函数作用是什么意思,C语言编译器中常见的函数用法以及作用详解

C语言的编译器中自带很多库函数,如果熟悉了,用起来操作起来都很方便,不仅能提高效率稳定性也是毋庸置疑的,毕竟都是世界级的大师写出来的。今天就来谈一谈,C语言自带的函数内存操作处理这一块

主要有:memcpy、memset、memet、memchr、memmove、strcpy、strncpy、strcmp、sprintf、atoi、atof等

首先加头文件

#include

"string.h"

#include

"stdlib.h"

#include

1,

memcpy函数

函数原型:void *memcpy(void *dest, const void *src, size_t

size);将一块内存的数据复制到另一块内存。当两块内存重叠的时候,memcpy就不能保证拷贝正确。

void *memcpy(void *dest, const void *src, size_t

count)

{

assert(dest!=NULL&&src!=NULL);

char *tmp = dest;

const char *s = src;

while (count--)

*tmp++ = *s++;

return dest;

}

注:memcpy函数从src的位置向后复制size个字节到dest的内存位置;这个函数在遇到

'\0'不会停下来;如果src和dest有任何的重叠,复制的结果都是未定义的。

2,memmove函数

函数原型:void *memmove(void *dst, const void *src, size_t

size); 可以拷贝内存重叠的,也可

以拷贝不重叠的。

void*

memmove(void *dest, const void *src, size_t size)

{

assert(dest);

assert(src);

char *str1 = (char *)dest;

const char *str2 = (const char *)src;

if ((str2 > str1) && (str2< str1 +

size))

{

while (size)

{

*str1 = *str2;

str1++;

str2++;

size--;

}

}

else

{

while (size--)

{

*(str1 + size) = *(str2 + size);

}

}

return dest;

}

需要注意的是,void型的指针不能进行自加操作,也不能进行解引用,所以函数中都进行了强制类型转化。因为操作过程中是一个字节一个字节进行,所以强制转化成char

*。比如:

void *p;

p++;//错误

*p = 1;//错误

和memcpy的差别是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。

3,

memset函数

函数原型:void* memset(void *dest,int c,size_t

size);给出内存的起始地址,将从起始地址开

始的size个字节赋值为字符c。

void * memset(void *dest,

int c, size_t size)

{

assert(dest);

char *pdest = (char *)dest;

while (size--)

{

*pdest++ = c;

}

return dest;

}

4,

memcmp函数

函数原型:void* memset(void * buf1, void * buf2,size_t

size); 比较从buf1和buf2指针开始的

size个字节的ascII码值。该函数是按字节比较的。

当buf1

当buf1==buf2时,返回值=0

当buf1>buf2时,返回值大于0

5,

memchr函数

void *memchr( const void *buffer, int ch, size_t

count );

函数在buffer指向的数组的count个字符的字符串里查找ch 首次出现的位置。返回一个指针,指向ch

在字符串中首次出现的位置,如果ch 没有在字符串中找到,返回NULL。

void *memchr (const void *buffer,int ch,int

n)

{

assert(buffer!=NULL);

char *cp=(char*)buffer;

while(*cp++!='\0'&&n)

{

if(*cp-ch==0)

return (void*)cp;

--n;

}

return NULL;

}

6,

memet函数

void

*memset(void *s, int ch,

函数解释:将s中当前位置后面的n个字节

(typedef

unsigned int size_t )用 ch

替换并返回

s

memset:作用是在一段内存块中填充某个给定的值,它是对较大的进行清零操作的一种最快方法

memset()

函数常用于内存空间初始化。如:

char str[100];

memset(str,0,100);

7,

strncpy函数

函数原型:char

*strncpy(char *dest, char *src, int

n);

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。说明:

如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。

如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回指向dest的指针(该指向dest的最后一个元素)

char * strncpy(char * dest,const char

*src,size_t count)

{ char *tmp =

dest;

while

(count-- && (*dest++ = *src++) != '/0')

;

return

tmp;

}

8、strcpy:

函数原型:extern char *strcpy(char

*dest,char *src);

头文件:string.h

功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回指向dest的指针。如果src的结尾不是'/0'的话,那么系统会在src的结尾处自动加一个'/0'。例如:

函数实现代码:

char *strcpy(char *strDest, const char

*strSrc) { assert((strDest!=NULL) && (strSrc

!=NULL)); char *address =

strDest; while( (*strDest++ = * strSrc++) != '/0') NULL ; return address

; }

9,

strcmp函数

函数原型:intstrcmp(constchar*s1,constchar*s2);

当s1时,返回为负数;当s1==s2时,返回值=

0;当s1>s2时,返回正数。

即:两个串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:

"A""A" "computer">"compare"

特别注意:strcmp(const

char *s1,const char * s2)这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。

ANSI标准规定,返回值为正数,负数,0

。而确切数值是依赖不同的C实现的。

10,

sprintf函数

int sprintf( char *buffer, const

char *format, [ argument] … );

buffer:型指针,指向将要写入的字符串的缓冲区。

format:格式化字符串。

[argument]...:可选参数,可以是任何类型的数据。

返回值

返回写入buffer

的字符数,出错则返回-1.

如果

buffer

format

是空指针,且不出错而继续,函数将返回-1,并且

errno

会被设置为

EINVAL。

sprintf

返回以format为格式argument为内容组成的结果被写入buffer

的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的buffer后,函数sprintf

返回5。

11,

atoi函数

int atoi(const char *nptr);

把字符串转换成数的一个函数。函数会扫描参数

nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果

nptr不能转换成

int 或者

nptr为空字符串,那么将返回

0[1]。特别注意,该函数要求被转换的字符串是按十进制数理解的。

#include

#include

intmain(void)

{

intn;

char*str = "12345.67";

n = atoi(str);

printf("n=%d\n",n);

return0;

}

输出:n

= 12345

12,atof函数

double

atof (const char* str);

函数 atof()

用于将字符串转换为双精度浮点数(double)。

tof()

的名字来源于 ascii

to floating point numbers 的缩写,它会扫描参数str字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace()函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。参数str

字符串可包含正负号、小数点或E(e)来表示指数部分,如123. 456

或123e-2。

返回值:返回转换后的浮点数;如果字符串 str 不能被转换为

double,那么返回 0.0。

注意:ANSI C

规范定义了stof()、atoi()、atol()、strtod()、strtol()、strtoul()共6个可以将字符串转换为数字的函数,大家可以对比学习;使用 atof() 与使用

strtod(str, NULL) 结果相同。另外在 C99 /

C++11 规范中又新增了5个函数,分别是atoll()、strtof()、strtold()、strtoll()、strtoull(),在此不做介绍,请大家自行学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值