探讨编写int strlen(char *strDest);不允许定义变量的问题
在论坛上看到一位前辈当年的面试题,原话是这样说的“有一次在面试时遇到这样一个问题:不允许调用库函数,也不允许使用任何全局或局部变量编写 int strlen(char *strDest); ”,无意中看到,自己想了一会儿,没有思路,后来整理了各位牛人的回复,觉得采用递归方法解决这个问题,是一种挺好的办法!于是,稍微写了一下代码,算是开拓视野的一点点积累吧!
代码如下:
#include "stdafx.h"
#include <iostream>
#include<assert.h> //使用断言assert的头文件
using namespace std;
//普通的方法
int MyStrlen(const char* strDest)
{
assert(NULL != strDest); //使用了断言,如果strDest为Null,则终止程序
int i(0);
while ('\0' != *strDest)//判断字符串结束的标志,'\0'标识符
{
i ++;
strDest ++;
}
return i;
}
//采用递归方式,没有定义新的全局变量和局部变量
int MyStrlen2(const char* strDest)
{
assert(NULL != strDest);//使用了断言,如果strDest为Null,则终止程序
if ('\0' != *strDest)
{
return 1 + MyStrlen2(++strDest);
}
else
{
return 0;
}
}
//和上面的方法类似,只不过采用的问号表达式
int MyStrlen3(const char* strDest)
{
assert(NULL != strDest);//使用了断言,如果strDest为Null,则终止程序
return ('\0' != *strDest) ? (1 + MyStrlen3((++strDest))) : 0; //这时候i++和++i的区别价值体现出来了,strDest++不行,考虑一下为何?
}
int _tmain(int argc, _TCHAR* argv[])
{
char a[] = {"Hello World!"};
cout << MyStrlen(a) << endl;
cout << MyStrlen2(a) << endl;
cout << MyStrlen3(a) << endl;
return 0;
}
注意 :++strDest不能换成strDest++, 这时候i++和++i的区别价值体现出来了,strDest++不行,考虑一下为何?
相关推荐
-
C语言中字符串和数字的相互转换实现代码
1.数字转换为字符串sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.sprintf 是个变参函数,定义如下: int sprintf( char *buffer, const char *format [, argument] ... ); 除了前两个参数类型固定外,后面可以接任意多个参数.printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以"%"开头的格式说明符(format
-
c语言输出字符串中最大对称子串长度的3种解决方案
问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度.例如输入字符串:"avvbeeb",该字符串中最长的子字符串是"beeb",长度为4,因而输出为4. 解决方法:中序遍历 一,全遍历的方法: 1.全遍历的方法,复杂度O(n3); 2.遍历原字符串的所有子串,然后判断每个子串是否对称: 实现方法是:我们让一个指针i从头至尾遍历,我们用另一个指针j从j=i+1逐一指向i后面的所有字符.就实现了原串的所有子串的遍历(子串为指针i到j中间的部分);最后判断得到的
-
C语言实现统计字符串单词数
字符串单词数.c #include<stdio.h> #define BUFFERSIZE 1024 int main() { char string[BUFFERSIZE]; int i,count=0,word=0; char c; gets(string) ; for(i=0;(c=string[i])!='\0';i++) { if(c==' ') word=0; else if(word==0) { word=1; count++; } } printf("%d \n&qu
-
C语言中关于sizeof 和 strlen的区别分析
1.编译时计算运算符sizeof,可用类型或变量做参数,计算占用内存的大小.sizeof后若是类型必须加括弧,若是变量名可不加括弧.sizeof(x)可用来定义数组维数如: 复制代码 代码如下: printf("%d\n", sizeof(short)); 输出的结果为短整型的长度2.用结构类型或变量做参数时,sizeof 返回实际的大小,当用于静态数组时,sizeof 返回全部数组的尺寸.sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 2.运行时计算strlen,
-
C语言求两个字符串的最长公共子串
本文实例讲述了C语言求两个字符串的最长公共子串的方法.分享给大家供大家参考.具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * str3); int stringLength(char * str); void main(){ char str1[50]; char st
-
基于C语言字符串函数的一些使用心得
就字符串的拼接函数为例strcat.原型:extern char *strcat(char *dest,char *src);用法:#include <string.h>功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'.说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针.举例: 复制代码 代码如下: // strcat.c #include <syslib.h&
-
C++不使用变量求字符串长度strlen函数的实现方法
本文实例讲述了C++不使用变量求字符串长度strlen函数的实现方法.分享给大家供大家参考.具体实现方法如下: 1.strlen的源码实现: size_t strlen(const char *str) //strlen不做内存非法判断,如果是NULL,会core. { const char *eos=str; while(*eos++); return (eos-str-1); } 2.常见面试题会要求不使用额外变量,实现strlen函数: 实现一: int strlen(const char
-
探讨编写int strlen(char *strDest);不允许定义变量的问题
在论坛上看到一位前辈当年的面试题,原话是这样说的"有一次在面试时遇到这样一个问题:不允许调用库函数,也不允许使用任何全局或局部变量编写 int strlen(char *strDest); ",无意中看到,自己想了一会儿,没有思路,后来整理了各位牛人的回复,觉得采用递归方法解决这个问题,是一种挺好的办法!于是,稍微写了一下代码,算是开拓视野的一点点积累吧! 复制代码 代码如下: #include "stdafx.h"#include <iostream>
-
C++程序中main(int argc, char *argv[])函数的参数意义
在vs中编写C++程序时,可以往主函数里传递两个参数:main(int argc,char *argv[]).主函数不能被其它函数调用,在window操作系统下调用者是. 测试程序如下所示: #include "stdafx.h" #include "iostream" using namespace std; int main(int argc,char *argv[]) { int i; for (i = 0; i < argc; i++) { cout
-
C语言中 int main(int argc,char *argv[])的两个参数详解
C语言中 int main(int argc,char *argv[])的两个参数详解 argc是命令行总的参数个数: argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数.命令行后面跟的用户输入的参数. int main(int argc, char* argv[]) { int i; for (i = 0; i<argc; i++) cout<<argv[i]<<endl; cin>>i; return 0; } 执行时敲入 F:\MYDOCU
-
对比MySQL中int、char以及varchar的性能
网络上有许多似是而非的"谣言",当然都不是恶意,绝大部分都是开发者不愿意自己主动研究,反而轻信其他人的信口之言. 关于数据库的谣言也有不少,比如"int性能比char高很多". 我最近针对int.long.char.varchar进行了一次性能测试,发现它们其实并没有太大的性能差距: 备注:c8=char(8), s8=varchar(8), i8=(bigint), c4=char(4), s4=varchar(4), i4=char(4) 100w行无索引情况下
-
不使用中间变量,交换int型的 a, b两个变量的值。
复制代码 代码如下: //by ppchen var a = 10, b = 2; a = a + b; b = a - b; a = a - b; 复制代码 代码如下: //by Mr.司马 var a = 10000,b=245 a = a^b; b = b^a; a = a ^b; 复制代码 代码如下: //by cloudgamer var a = 33,b=44 a=[a,b] b=a[0] a=a[1] 复制代码 代码如下: //by Mr.司马 var a = 23,b=454;
-
javascript定义变量时有var和没有var的区别探讨
我们先来看一段代码 function show(){ alert(abc); } var abc="defg"; show(); 有过C++或Java编程经验的人可能会说:"这程序,死定了,变量竟然在引用了该变量的函数后边定义,bug会灭掉你的."放在浏览器上运行一下,结果怎样?完美运行!接下来我们就说一下这是咋回事--有var和没有var定义的变量的区别. 1.没有var 简明的说,定义变量时省略var是不安全的,不过是合法的.这时无论该变量是在什么位置定义的,解
-
JavaScript定义变量和变量优先级问题探讨
看下面的代码: 复制代码 代码如下: if (!("aa" in window)) { alert('oh my god'); var aa = 1; } alert("aa" in window); alert(aa); 回答以下问题: 会报错吗?会弹出几次? 第2个alert是true还是false? 第3个alert弹出什么? 为什么? 思考下,然后测试下,如果你回答正确,那么后面的文章就不用看了. -------------------
-
C语言基础 strlen 函数
目录 一.strlen 函数简介 二.strlen 函数实战 一.strlen 函数简介 在C 语言中,char 字符串也是一种非常重要的数据类型,我们可以使用 strlen 函数获取字符串长度: 字符串: 一般用一对双引号" "括起的一串字符来表示字符串常量,字符串默认以转义字符 '\0' 结尾,字符串常量是不可被修改的: strlen 函数 会扫描整个字符串,直到碰到第一个字符串结束符 '\0'为止,然后返回计数器值(长度不包含 '\0'): /* *描述: * [in] s:字符
-
C语言strlen函数实现读取字符串长度详解
目录 前言 1.函数strlen 2.使用指针 3.指针改进 4.使用递归 5.my_strlen函数的参数改进—常量指针 总结 前言 读取字符串的长度,使用函数 strlen.这里我们写一个函数,来读取字符串的长度,本文内容主要包括: 使用strlen 使用指针:是常规的方法,但是要创建变量 指针改进:不需要创建变量,要求高,不易掌握 使用递归:不需要创建变量,要求高,不易掌握 介绍常量指针—— const char* str 1.函数strlen int main() { char arr[
-
C字符串与C++中string的区别详解
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别: C字符串 string对象(C++) 所需的头文件名称 <string>或<string.h> <string>或<string.h> 需要头文件 原因 为了使用字符串函数 为了使用string类 声明 方式 char name[20]; string name; 初始化方式 char name[20]="
随机推荐
- FLEX ArrayCollection删除过滤的数据问题解决
- 基于jquery实现的鼠标滑过按钮改变背景图片
- javascript XMLHttpRequest对象全面剖析
- IOS开发代码分享之获取启动画面图片的string
- iOS 获取公历、农历日期的年月日的实例代码
- Python编程实现二叉树及七种遍历方法详解
- PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
- Nginx下配置pathinfo及ThinkPHP的URL Rewrite模式支持
- php rmdir使用递归函数删除非空目录实例详解
- ASP javascript Application对象的Contents和StaticObjects做Cache的一些经验
- Android DragVideo实现播放视频时任意拖拽的方法
- js 实现 input type="file" 文件上传示例代码
- PHP文件上传操作实例详解
- SQL Server 2005的cmd_shell组件的开启方法
- JavaEE组件commons-fileupload实现文件上传、下载
- Javascript 按位左移运算符使用介绍(<<)
- 浅谈js的异步执行
- 通过身份证号得到出生日期和性别的js代码
- Nginx上传文件全部缓存解决方案
- 深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复