字符串操作1 - 递归与非递归两种方法求字符串长度

 1 //递归求字符串的长度
 2 int RecurseLength(const char *str)
 3 {
 4     if(str == NULL || *str == ‘\0‘)
 5       return 0;
 6
 7  if(*str == ‘\0‘)
 8      return 0;
 9  return RecurseLength(str+1) + 1;//返回当前字符数,再递归处理下一个字符
10 }
11
12
13
14
15
16 //非递归求字符串长度
17 int NonRecurseLength(const char *str)
18 {
19   const char *p = str;
20
21   // 注意这一句,while循环完了之后 ,str指向了哪个位置?是指向字符串的最后一个位置 ‘\0‘ 吗?
22
23   // 事实上str并不是指向了‘\0‘,而是指向了 ‘\0’ 的下一个位置
24
25    while (*str++);  
26
27   return str-p -1;
28 }

注:while (*str++); 这句话如何理解 ?我之前的理解是这样的

1 先判断  *str  是否为true ,如果为true,str++,指向下一个位置

2 如果 *str  为false,跳出while循环,此时str应该指向 ‘\0‘

如果是这样的话,那 return 就应该返回  str - p 才对,为什么返回 str-p-1呢?所以,这样的理解是错误的

其实while(*str++);

可以这样理解 ,把这句代码分几个步骤:

while(*str++)相当于:

const char t = *p
p++
while (t)

p先++了,然后再去判断while(t),所以,最后的结果就是 str指向了\0的最后一个位置

不信我们可以用代码难一下,直接上图:

看吧,p指向了\0的后一个字符的位置

时间: 2024-10-05 23:04:47

字符串操作1 - 递归与非递归两种方法求字符串长度的相关文章

两种方法求丑数

我们把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 方法1 : 暴力破解,逐个判断 代码: <pre name="code" class="cpp">#include <iostream> #include <vector> using namespace std; //判断是否是丑数 bool isUgly(int index){ while(index % 2

HDU 1013 Digital Roots(两种方法,求数字根)

Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 67949    Accepted Submission(s): 21237 Problem Description The digital root of a positive integer is found by summing the digits of

55. 2种方法求字符串的组合[string combination]

[本文链接] http://www.cnblogs.com/hellogiser/p/string-combination.html [题目] 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. [分析] 在之前的博文28.字符串的排列[StringPermutation]中讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. [递归法求组合] 可以考虑求长度为n的字符串中m个字符的组合,

归并排序,树状数组 两种方法求逆序对

我们知道,求逆序对最典型的方法就是树状数组,可是另一种方法就是Merge_sort(),即归并排序. 实际上归并排序的交换次数就是这个数组的逆序对个数,为什么呢? 我们能够这样考虑: 归并排序是将数列a[l,h]分成两半a[l,mid]和a[mid+1,h]分别进行归并排序,然后再将这两半合并起来. 在合并的过程中(设l<=i<=mid,mid+1<=j<=h).当a[i]<=a[j]时.并不产生逆序数:当a[i]>a[j]时.在 前半部分中比a[i]大的数都比a[j]

Java编程:用两种方法求输入正整数的位数。

import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); //把整数n转换为字符串求其长度 int len = Integer.toString(n).length(); System.out.println("用字符串的方式求其长度len="+len);

将整数n这个数字转换为对应的字符串,保存到s中(两种方法)

方法一. 用循环的方法取出每一位,存到字符数组中,最后将数组翻转. 代码实现如下: #include<stdio.h>#include<string.h>#include<assert.h>#define MAX 20void reverse(char *left, char *right){ assert(left); assert(right); while (left < right) {  int tmp = *left;  *left = *right;

c语言:两种方法实现字符串拷贝strcpy

实现字符串拷贝strcpy 方法一: // 字符串拷贝函数的实现 #include<stdio.h> #include<assert.h> void my_strcpy(char *dest,  char *src)//src表示source源,dest目标 { assert(dest!=NULL); assert(src); char *ret = dest; while (*dest++ = *src++) { ; } return dest; } int main() { c

http的get字符串类型和post自定义类的两种方法--测试成功

1. string类型的参数,get方法 /// <summary> /// 执行服务的方法 /// </summary> /// <param name="MethodName">方法名称</param> /// <param name="pars">参数列表</param> /// <param name="_type">返回值类型</param>

两种方法求最大公约数最小公倍数

<pre name="code" class="cpp">/* *coyright(c)2014 龙城无泪 *All rights reserved *文件名称 digui.c *作者:封尘之魂 *完成日期:20141108 *版本号V1.0 *问题描述:求两个整数的最大公约数最小公倍数 *输入描述:输入两个整数 *输出描述:成功输出最大公约数最小公倍数 */ #include<stdio.h> int main() {int m,n,q,t