探討編寫int strlen(char *strDest);不允許定義變量的問題
更新時(shí)間:2013年05月29日 09:10:49 作者:
本篇文章是對(duì)編寫int strlen(char *strDest);不允許定義變量的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
在論壇上看到一位前輩當(dāng)年的面試題,原話是這樣說的“有一次在面試時(shí)遇到這樣一個(gè)問題:不允許調(diào)用庫(kù)函數(shù),也不允許使用任何全局或局部變量編寫 int strlen(char *strDest); ”,無(wú)意中看到,自己想了一會(huì)兒,沒有思路,后來(lái)整理了各位牛人的回復(fù),覺得采用遞歸方法解決這個(gè)問題,是一種挺好的辦法!于是,稍微寫了一下代碼,算是開拓視野的一點(diǎn)點(diǎn)積累吧!
#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)//判斷字符串結(jié)束的標(biāo)志,'\0'標(biāo)識(shí)符
{
i ++;
strDest ++;
}
return i;
}
//采用遞歸方式,沒有定義新的全局變量和局部變量
int MyStrlen2(const char* strDest)
{
assert(NULL != strDest);//使用了斷言,如果strDest為Null,則終止程序
if ('\0' != *strDest)
{
return 1 + MyStrlen2(++strDest);
}
else
{
return 0;
}
}
//和上面的方法類似,只不過采用的問號(hào)表達(dá)式
int MyStrlen3(const char* strDest)
{
assert(NULL != strDest);//使用了斷言,如果strDest為Null,則終止程序
return ('\0' != *strDest) ? (1 + MyStrlen3((++strDest))) : 0; //這時(shí)候i++和++i的區(qū)別價(jià)值體現(xiàn)出來(lá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++, 這時(shí)候i++和++i的區(qū)別價(jià)值體現(xiàn)出來(lái)了,strDest++不行,考慮一下為何?
復(fù)制代碼 代碼如下:
#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)//判斷字符串結(jié)束的標(biāo)志,'\0'標(biāo)識(shí)符
{
i ++;
strDest ++;
}
return i;
}
//采用遞歸方式,沒有定義新的全局變量和局部變量
int MyStrlen2(const char* strDest)
{
assert(NULL != strDest);//使用了斷言,如果strDest為Null,則終止程序
if ('\0' != *strDest)
{
return 1 + MyStrlen2(++strDest);
}
else
{
return 0;
}
}
//和上面的方法類似,只不過采用的問號(hào)表達(dá)式
int MyStrlen3(const char* strDest)
{
assert(NULL != strDest);//使用了斷言,如果strDest為Null,則終止程序
return ('\0' != *strDest) ? (1 + MyStrlen3((++strDest))) : 0; //這時(shí)候i++和++i的區(qū)別價(jià)值體現(xiàn)出來(lá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++, 這時(shí)候i++和++i的區(qū)別價(jià)值體現(xiàn)出來(lái)了,strDest++不行,考慮一下為何?
相關(guān)文章
C++中typedef 及其與struct的結(jié)合使用
這篇文章主要介紹了C++中typedef 及其與struct的結(jié)合使用,需要的朋友可以參考下2014-02-02C++實(shí)現(xiàn)LeetCode(43.字符串相乘)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(43.字符串相乘),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C/C++標(biāo)準(zhǔn)庫(kù)之轉(zhuǎn)換UTC時(shí)間到local本地時(shí)間詳解
最近遇到一個(gè)問題:數(shù)據(jù)庫(kù)中存放的時(shí)間為UTC時(shí)間,但是現(xiàn)在要求都出來(lái)顯示的時(shí)間為本地時(shí)間,所以就用C++實(shí)現(xiàn)了,下面這篇文章主要給大家介紹了關(guān)于C/C++標(biāo)準(zhǔn)庫(kù)之轉(zhuǎn)換UTC時(shí)間到local本地時(shí)間的方法,還有C++中獲取UTC時(shí)間精確到微秒的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2017-11-11C語(yǔ)言如何在字符數(shù)組中插入一個(gè)字符
這篇文章主要介紹了C語(yǔ)言如何在字符數(shù)組中插入一個(gè)字符,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06vs2019安裝及簡(jiǎn)單處理技巧(超詳細(xì))
這篇文章主要介紹了vs2019安裝及簡(jiǎn)單處理方法,本文是一篇非常詳細(xì)的教程,通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06C++數(shù)據(jù)結(jié)構(gòu)之AVL樹的實(shí)現(xiàn)
AVL樹是高度平衡的而二叉樹,它的特點(diǎn)是AVL樹中任何節(jié)點(diǎn)的兩個(gè)子樹的高度最大差別為1,本文主要給大家介紹了C++如何實(shí)現(xiàn)AVL樹,需要的朋友可以參考下2022-06-06C語(yǔ)言程序如何求學(xué)生總成績(jī)和平均成績(jī)
這篇文章主要介紹了C語(yǔ)言程序如何求學(xué)生總成績(jī)和平均成績(jī),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11