strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );
return NULL;
|
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
memcpy和memmove区别:
1、当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。但memcopy比memmove的速度要快一些.
2、对于库函数来说,由于没有办法知道传递给他的内存区域的情况,所以应该使用memmove()函数。通过这个函数,可以保证不会出现任何内存块重叠问题。而对于应用程序来说,因为代码“知道”两个内存块不会重叠,所以可以安全地使用memcpy()函数。
=======================================================
内存重叠:拷贝的目的地址在源地址范围内。
内存重叠环境的例子:
int main()
{char *p = NULL;
p=(char*)malloc(100);
memcpy(p,"123456789",strlen("123456789")); //会等到错误的结果,有一个长度参数,只能拷贝cnt个
//字节就结束了
printf("before p =%s\n",p);
strcpy(p+1,p); //注意:这里重叠了,而strcpy是根据判断原串中的'\0'
printf("after p =%s\n",p);
free(p);
}
========================================================
atoi()函数
atoi():int atoi(const char *str );
功能:把字符串转换成整型数。
str:要进行转换的字符串
返回值:每个函数返回 int 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则atoi的返回值为 0。
说明:当第一个字符不能识别为数字时,函数将停止读入输入字符串。
[cpp] view plain copy
- #include<iostream>
- using namespace std;
- int atoi_my(const char *str)
- {
- int s=0;
- bool falg=false;
- while(*str==' ') //字符串前的空白
- {
- str++;
- }
- if(*str=='-'||*str=='+') //字符串所表示数值的正负号,正号,指针指向下一个字符,负号,则置flag为true
- {
- if(*str=='-')
- falg=true;
- str++;
- }
- while(*str>='0'&&*str<='9') // 把数字字符串逐个转换成整数
- {
- s=s*10+*str-'0';
- str++;
- if(s<0)
- {
- s=2147483647; //考虑溢出
- break;
- }
- }
- return s*(falg?-1:1);
- }
- int main()
- {
- char *s1="333640";
- char *s2="-12345";
- char *s3="123.3113";
- char *s4="-8362865623872387698";
- char *s5="+246653278";
- int sum1=atoi(s1);
- int sum_1=atoi_my(s1);
- int sum2=atoi(s2);
- int sum_2=atoi_my(s2);
- int sum3=atoi(s3);
- int sum_3=atoi_my(s3);
- int sum4=atoi(s4);
- int sum_4=atoi_my(s4);
- int sum5=atoi(s5);
- int sum_5=atoi_my(s5);
- cout<<"atoi: :"<<sum1<<endl;
- cout<<"atoi_my:"<<sum_1<<endl;
- cout<<"atoi: :"<<sum2<<endl;
- cout<<"atoi_my:"<<sum_2<<endl;
- cout<<"atoi: :"<<sum3<<endl;
- cout<<"atoi_my:"<<sum_3<<endl;
- cout<<"atoi: :"<<sum4<<endl;
- cout<<"atoi_my:"<<sum_4<<endl;
- cout<<"atoi: :"<<sum5<<endl;
- cout<<"atoi_my:"<<sum_5<<endl;
- system("pause");
- return 0;
- }
这是因为s是个int型数据,即使在VC环境下,系统也仅仅给它分配四个字节的内存。它能表示的整数范围为: -2147483648~2147483647(如果是在16位操作系统中,比如你用TC编译环境,int仅占2个字节,表示的范围为:-32768~32767)
当s的值超过int型数据所能表示的最大的2147483647时,就叫做溢出.
(不信你可以做个测试,令s=2147483647,然后输出s+1,你看到的输出结果是一个负值),
溢出以后s会 变成负的(这是因为二进制数据在计算机中以它的补码存放)