如题,这2个不知难倒了多少英雄汉吧,我也不会,所以今天必须学习,干掉它们。其实倒不是不会,只是本能的抵触C还有C++程序。不知为啥。。。那也得学习啊。
1.实现Strlen(char * str)
传说常见的一个笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。
函数接口声明如下:
int strlen (const char *p);
(1)实现方法一:
/* 不用中间变量,用递归实现,很容易看懂 */
int strlen(const char *str)
{
if ('\0' == *str)
return 0;
else
return strlen(str+1) + 1;
}
(2)实现方法二:
/* 不用中间变量,也是用递归实现,写得更简洁而已 */
int strlen(const char *str)
{
return *str?(strlen(++str) + 1) : 0;
}
(3)实现方法三:
/* 使用了一个int型变量 */
int strlen(const char *str){
if(str==NULL) return 0;
int len = 0;
for( ; *str++ != '\0'; ){
len++;
}
return len;
}
参考链接:
http://blog.csdn.net/tianmo2010/article/details/6667111
http://www.51testing.com/html/72/n-221172.html
2.实现strcpy(char * str)
备注:搜狗的笔试题有这个,我当时没做上,正好今天有空,加上昨天看面试题的时候,碰到了上面那个题,就直接把这2个好好学习学习。
第一种:
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != ‘\0’ );//把后一个字符串的第一个字符赋值给前面一个字符串的第一个字符的地址上,如果碰到'\0'就退出.此时后一个字符串也把'\0'赋值给了前一个字符串的尾部
}
第二种:
void strcpy( char *strDest, const char *strSrc )
{
while( (*strDest++ = * strSrc++) != ‘\0’ );//与前一个基本相同,只是多了一个const关键字,const的作用是说明后一个字符串是只读变量,不允许修改
}
第三种:
void strcpy(char *strDest, const char *strSrc)
{
assert( (strDest != NULL) && (strSrc != NULL) );assert是一个测试函数,如果条件为真就继续往下前,如果条件为假就直接退出.这里是为了测试这二个字符串是否非空,其它与前面一样.
while( (*strDest++ = * strSrc++) != ‘\0’ );
}
第四种:
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address; //这是一个返回字符串的函数,char *strcpy(),address是在函数里面定义的一个指什,它的作用仅仅就是返回它所指向的那个地址,函数结束后,这个指针也就不存在了,return address仅仅就是返回它指向strDest这个字符串的首地址,因为strDest是函数的一个参数,它不属于这个函数定义的变量,所以函数结果后,这个字符串是存在的,所以返回首地址是可以正确的读出这个字符串,strDest的内存空间不会在函数结果后收回.
}
参考链接:
http://blog.csdn.net/jianxiong8814/article/details/1639863
http://zhidao.baidu.com/question/117009150.html
http://blog.sina.com.cn/s/blog_5d30110e0100z3uo.html