字符串拷贝函数递归与非递归的C语言实现
2014-03-12 14:23
239 查看
初学递归的时候,觉得很抽象,不好分析,确实如此,尤其是有些时候控制语句不对,导致程序进去无限次的调用,更严重的是栈溢出。既要正确的控制结束语句,又要有正确的进入下次递归的语句,还要有些操作语句......。所以要使用递归,必须每一层的思路要相当清晰。而循环和递归还是挺类似的说,循环的次数可以近似的理解为要递归是次数。那么下面我们看看递归和循环的区别:
1.递归实现strcpy函数:
分析:to 是目的字符串地址的一份拷贝,from是源字符串地址的一份拷贝。这个递归函数的结束控制语句就是源字符串的内容为'\0'的时候,递归结束。要是源字符串的内容不为'\0' ,则进行赋值操作*to++ = *from++ ,执行完赋值语句之后,进入下一轮递归调用,而目的串和源串的地址也要进行相应的偏移,直到源字符串的内容为'\0'的时候,往目的地址里面添加一个'\0',然后结束,继而跳出结束该函数。
下面是非递归的方法实现strcpy函数:
分析:非递归实现主要的关键语句在于循环”while( (*to++=*from++) != '\0');“这句话是先赋值,然后再与'\0'比较,等于则跳出循环,不等于则继续循环。
总结:该函数的实现主要在于操作系统自动会在字符串末尾加上一个字符'\0'来表示字符串到此结束。所以利用这个关键点,可以方便的实现字符串拷贝的操作。
介于本人水平有限,欢迎指错,谢谢!
1.递归实现strcpy函数:
void _strcpy(char *to,const char *from) { if('\0' == *from){ *to = '\0'; return ; } *to++ = *from++; _strcpy(to,from); }
分析:to 是目的字符串地址的一份拷贝,from是源字符串地址的一份拷贝。这个递归函数的结束控制语句就是源字符串的内容为'\0'的时候,递归结束。要是源字符串的内容不为'\0' ,则进行赋值操作*to++ = *from++ ,执行完赋值语句之后,进入下一轮递归调用,而目的串和源串的地址也要进行相应的偏移,直到源字符串的内容为'\0'的时候,往目的地址里面添加一个'\0',然后结束,继而跳出结束该函数。
下面是非递归的方法实现strcpy函数:
void* _strcpy(char *to,const char *from) { assert( to != NULL || NULL != from); char *dest = to; while( (*to++=*from++) != '\0'); return (void*)dest; }
分析:非递归实现主要的关键语句在于循环”while( (*to++=*from++) != '\0');“这句话是先赋值,然后再与'\0'比较,等于则跳出循环,不等于则继续循环。
总结:该函数的实现主要在于操作系统自动会在字符串末尾加上一个字符'\0'来表示字符串到此结束。所以利用这个关键点,可以方便的实现字符串拷贝的操作。
介于本人水平有限,欢迎指错,谢谢!
相关文章推荐
- 求字符串长度之递归与非递归的C语言实现
- 使用C语言递归与非递归实现字符串反转函数char *reverse(char *str)的方法
- 实现C语言的拷贝函数且将复制后的字符串逆序,不能使用库函数,不能定义其他的变量。
- 递归和非递归分别实现strlen(C语言)
- C语言非递归实现字符串逆转
- 用c语言实现字符串的拷贝函数(不使用库函数)
- 用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)
- C语言实现 二分查找数组中的Key值(递归和非递归)
- C语言:编写reverse_string(char * string)(递归实现)函数,将参数字符串中的字符反向排列
- 【c语言】编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列。
- 【C语言】编写一个函数reverse_string(char * string)(递归实现),将参数字符串中的字符反向排列,不能使用C函数库中的字符串操作函数。
- C语言实现字符串拷贝函数有几种方式
- C语言简单递归实现字符串逆序输出
- 递归和非递归分别实现求第n个斐波那契数(C语言)
- C语言实现二叉树的递归遍历和非递归遍历
- C语言实现-递归和非递归求第n个斐波那契数
- C语言实现字符串拷贝函数的几种方法
- (C语言)递归实现字符串反转
- 实现C语言的拷贝函数且将复制后的字符串逆序,不能使用库函数,不能定义其他的变量。
- 使用C/C++实现对字符串的反转(递归和非递归)