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(),在此不做介绍,请大家自行学习。