雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門(mén)教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

探討編寫(xiě)int strlen(char *strDest);不允許定義變量的問(wèn)題

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊:

在論壇上看到一位前輩當(dāng)年的面試題,原話是這樣說(shuō)的“有一次在面試時(shí)遇到這樣一個(gè)問(wèn)題:不允許調(diào)用庫(kù)函數(shù),也不允許使用任何全局或局部變量編寫(xiě) int strlen(char *strDest);  ”,無(wú)意中看到,自己想了一會(huì)兒,沒(méi)有思路,后來(lái)整理了各位牛人的回復(fù),覺(jué)得采用遞歸方法解決這個(gè)問(wèn)題,是一種挺好的辦法!于是,稍微寫(xiě)了一下代碼,算是開(kāi)拓視野的一點(diǎn)點(diǎn)積累吧!

復(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;
}
//采用遞歸方式,沒(méi)有定義新的全局變量和局部變量
int MyStrlen2(const char* strDest)
{
 assert(NULL != strDest);//使用了斷言,如果strDest為Null,則終止程序
 if ('\0' != *strDest)
 {
  return 1 + MyStrlen2(++strDest);
 }
 else
 {
  return 0;
 }
}
//和上面的方法類(lèi)似,只不過(guò)采用的問(wèn)號(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++不行,考慮一下為何?

上一篇:C++ 構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼

欄    目:C語(yǔ)言

下一篇:C字符串與C++字符串的深入理解

本文標(biāo)題:探討編寫(xiě)int strlen(char *strDest);不允許定義變量的問(wèn)題

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/4400.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有