探讨编写int strlen(char *strDest);不允许定义变量的问题_C 语言

在论坛上看到一位前辈当年的面试题,原话是这样说的“有一次在面试时遇到这样一个问题:不允许调用库函数,也不允许使用任何全局或局部变量编写 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++不行,考虑一下为何?

时间: 2024-11-03 19:52:03

探讨编写int strlen(char *strDest);不允许定义变量的问题_C 语言的相关文章

C语言编写基于TCP和UDP协议的Socket通信程序示例_C 语言

Tcp多线程服务器和客户端程序服务器程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 char

基于Sizeof与Strlen的区别以及联系的使用详解_C 语言

一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当参数分别如下时,sizeof返回的值表示

QString和char以及string之间的赋值详解_C 语言

一.QString赋值给char*      例如: QString  qstr:             char *str = qstr.toLatin1().data();//这样便把qstr中的值传给了str 二 .char [] 赋值给string        char str[32];        string str2(str);//这样便把str中的值传给了str2 三 .char* 赋值给QString         例如:char *str1;             

VC之CString,wchar_t,int,string,char*之间的转换

    VC之CString,wchar_t,int,string,char*之间的转换 1. CString 转 wchar_t CString path = "asdf"; wchar_t wstr[256] = path.AllocSysString(); 或者: wchar_t wcstring[256]; MultiByteToWideChar(CP_ACP,0,path,-1,wcstring,256);   2. wchar_t转CString WideCharToMul

strlen-void GetArgments(int argc, char **argv)

问题描述 void GetArgments(int argc, char **argv) void GetArgments(int argc, char **argv) { int i; for(int i=1;i { if(argv[i][0]=='-') { switch(tolower(argv[i][1])) { case 'p': if(strlen(argv[i])>3) port=atoi(&argv[i][3]); break; case 'h': hostName=&

详解C语言中的char数据类型及其与int类型的转换_C 语言

C语言中的char变量 char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed.虽然char在标准中是unsigned(因为char类型提出的初衷是用来表示ascii码,ascii码的范围是0~127),但实际情况中究竟是signed还是unsigned取决于编译器. 可通过下面程序判断编译器的默认char类型: void char_type() { char c=0xFF; if(c==-1) printf

数据库-在2000中 int 与 char 和 money 都能进行默认转换吗

问题描述 在2000中 int 与 char 和 money 都能进行默认转换吗 在20000数据库中可以直接将money类型转换为char类型吗 解决方案 用convert函数转为nvarchar之类的 解决方案二: 在2005中是不是就不用convert 就能直接转换

CString, int, string, char*之间的转换

1 CString,int,string,char*之间的转换     string转CString     CString.format("%s", string.c_str());     char转CString     CString.format("%s", char*);     char转string     string s(char *);     string转char *     char *p = string.c_str();     //

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;