美丽的章鱼动画片:简单的c语言的问题,谢谢高手

来源:百度文库 编辑:高考问答 时间:2024/04/27 16:31:51
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ )
NULL ;
return address ;
}

这个例子是做一个strcpy的函数,不大明白while里面的意思,还有\0是什么啊?

assert这句里面是什么啊?
求求高手,帮帮忙,多谢
重奖。

assert是当括号里的内容为假时程序报错。
while( (*strDest++ = * strSrc++) != ‘\0’ )
这句while是精华啊~~~~~将*strSrc赋值给*strDest,然后判断是不是已经到达\0(即字符串结尾),同时,执行完赋值后strSrc和strDest指针均后移一位。总的结果即是:将strSrc指向的内容复制到strDest,直到strSrc指向\0.
\0代表字符串的结束符。
你把这个while弄明白了,对指针的理解就深一层了。

ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:
......
ASSERT( n != 0);
k = 10/ n;
......
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。
assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。

就是将strSrc中的字符一个个赋值给strDest。

换种好理解的写法就是
while( (*strDest++ = * strSrc++) != ‘\0’ )

while((*strSrc)!='\0')
{
*strDest=*strScr;
strScr++;
strDest++;
}

这样能看懂了吧?

char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL));
//判断strDest strSrc 2个指针都不会NULL,NULL的话接下去就要出错了,你完全可以自己判断,但是这是程序员通用的方法
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ )
NULL ;
//一直拷贝到'\0',C中字符串结束标志
return address ;
//其实就是返回strDest指针拉
}

assert是发现错误并报错的宏语句,一般软件中都会用到。
(*strDest++ = * strSrc++) != '\0'是先*strDest++ = * strSrc++赋值后,再比较*strDest++ 指针是否为'\0',若没有到结尾的话就返回1,若是到了字符串的结尾就返回0,(*char字符串结尾都默认是'\0').

一个assert的实现: 在assert.h文件中
#ifdef NDEBUG
#define assert(exp) ((void)0)

#else
#ifdef __cplusplus
extern "C" {
#endif
_CRTIMP void __cdecl _assert(const char *, const char *, unsigned);
#ifdef __cplusplus
}
#endif
#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
#endif /* NDEBUG */

其中_assert(), 最关键, 在assert.c文件中, 他的作用是
The assert macro calls this routine if the assert expression is
true. By placing the assert code in a subroutine instead of within
the body of the macro, programs that call assert multiple times will
save space.