一个简单问题,散分,在线等待ing... void foo(char *a, char *b){ while(*a++ = *b++)}请问:这个函数的功能是什么?是内存拷贝,还是字符串拷贝,还是其他的功能啊?大家帮帮小弟,谢谢啦! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在这里说字符串拷贝比较准确。因为while会在取值为零的时候退出 如果两个字符串长度不一样怎么办,还是老老实实用strcpy吧 把B的字符拷贝到A里面,直到B结束 这样写很不安全,a可能会越界。下面是我的一个测试:#include <stdlib.h>#include <string.h>#include <stdio.h>void foo(char *a, char *b){ while(*a++ = *b++);}int main(){ char a[] = "abcdefg"; char b[3]; printf("a.length=%d\n",strlen(a)); printf("a:%s\n",a); foo(b,a); printf("***********\n"); printf("a.length=%d\n",strlen(a)); printf("b.length=%d\n",strlen(b)); printf("a:%s\n",a); printf("b:%s\n",b); return 0;}输出结果:a.length=7a:abcdefg**************a.length=3b.length=7a:efgb:abcdefg可以看见由于b数组已经越界,在拷贝中,把a数组的内存空间吃掉了。从而造成了内存内容的不可知,无法寻址了。 C 里 缓冲区 不能越界应该是调用函数的人保证的. 跟函数本身无关. 调用者应该明白调用这个函数必需提供足够大的缓冲区. 这是设计模式问题,这里的函数本身没错,也不存在设计上的缺陷.我要说的是, 1) 语法问题: while 后 应该用 分号结束, 这里没有2) 效率不高对于32位系统,执行单字节拷贝,效率很低根据结束条件, 是拷贝至0, 这个函数实现的是 拷贝以 0 结尾的符串. 字符拷贝的实现。以下实现相同功能: char* strcpy(char* a, char* b){ int i; for(i=0; (a[i]=b[i])!=0; i++); return a; } char* strcpy(char* a, char* b){ char* c=a; while(*a++=*b++); return c; }char* strcpy(char* a, char* b){ char* c=a; while(*b){ *a=*b; a++; b++ ; } *a=*b; a++; b++ ; return c; }char* strcpy(char* a, char* b){ char* c=a; while(*b){ *a=*b; a++; b++ ; } *a=0; return c; } sz字符串COPY的一个不安全的实现 strcpy同样也无法判断是否越界,所以控制是否越界,应该需要客户程序自己控制 GDI+ 绘制位图 和 绘制矢量图 的效率问题 请教 注册ocx控件时,提示找不到指定的程序 在window server系统下、 VC使用AlphaBlend实现位图淡出遇到一个小问题 如何封装?? 怎样通过查询注册表用VC实现判断不同类型的USB设备?? 怎样HOOK COM接口? 请教 音频合成(混音)的算法 对于多个ToolBar,如何让程序一开始启动时设置好它们的位置? 有没有谁有类似vc中的智能感应的实现方法? 请问如何将BMP图形文件转换为JPEG文件 如何获得刚刚失去焦点窗口的句柄当激活我自己的程序的时候? 如何获得当前新增行的某个字段的值
因为while会在取值为零的时候退出
下面是我的一个测试:#include <stdlib.h>
#include <string.h>
#include <stdio.h>void foo(char *a, char *b)
{
while(*a++ = *b++);
}int main(){
char a[] = "abcdefg";
char b[3];
printf("a.length=%d\n",strlen(a));
printf("a:%s\n",a);
foo(b,a);
printf("***********\n");
printf("a.length=%d\n",strlen(a));
printf("b.length=%d\n",strlen(b));
printf("a:%s\n",a);
printf("b:%s\n",b);
return 0;
}
输出结果:
a.length=7
a:abcdefg
**************
a.length=3
b.length=7
a:efg
b:abcdefg
可以看见由于b数组已经越界,在拷贝中,把a数组的内存空间吃掉了。
从而造成了内存内容的不可知,无法寻址了。
2) 效率不高对于32位系统,执行单字节拷贝,效率很低根据结束条件, 是拷贝至0, 这个函数实现的是 拷贝以 0 结尾的符串.
char* strcpy(char* a, char* b){
int i;
for(i=0; (a[i]=b[i])!=0; i++);
return a;
}
char* strcpy(char* a, char* b){ char* c=a;
while(*a++=*b++);
return c;
}
char* strcpy(char* a, char* b){ char* c=a;
while(*b){ *a=*b;
a++;
b++ ;
}
*a=*b;
a++;
b++ ;
return c;
}
char* strcpy(char* a, char* b){ char* c=a;
while(*b){ *a=*b;
a++;
b++ ;
}
*a=0;
return c;
}