借刀殺人,不使用任何中間變數實現strlen
Sailor_forever sailing_9806@163.com 轉載請註明
http://blog.csdn.net/sailor_8318/archive/2008/10/13/3071048.aspx
2009騰迅校園招聘筆試題:不使用中間變數求const字串長度,即實現求字串長度庫函數strlen函數。函數介面聲明如下:int strlen(const char *p);
思路分析:
在字串中通常可以利用最後一個結束符’/0’,但此處參數為const,唯讀,那麼我們不能打他的主意
函數運行過程中不佔用記憶體基本不可能,除非都使用了寄存器。“不使用中間變數”只是說程式員不能顯示的申請記憶體而已,即不能有局部變數或者動態記憶體申請。
如果函數自動申請棧記憶體或者使用寄存器儲存變數,或者使用立即數定址即常量,那麼就相當於“不使用中間變數”。
從函數原型看,傳回值為int,那麼在函數內部必定需要一個地方儲存這個值,要麼是常數要麼是寄存器。長度不為1時不能一次就求出來,說明必須有遞迴調用,這樣遞迴時函數會自動申請棧記憶體,這樣就相當於程式員“不使用中間變數”了。中間返回的值通過寄存器自動儲存,最後一次返回時拷貝到int中去。
C++中也有臨時對象的概念,都是程式在運行過程中由編譯器在棧中自動申請的對象,對程式員不可見,也相當於“不使用中間變數”
另外一個不申請任何變數的典型題目是:反轉字串(http://blog.csdn.net/sailor_8318/archive/2008/10/11/3058240.aspx)
這種問題都是利用常量,或者將變數的申請交給編譯器在遞迴過程中自動在棧中申請,也就是借刀殺人了,不管我的事,我只是出來打醬油的,哈哈
//////////////////////////////////////////////////////////////////////////
int NoMallocStrlen(const char *str)
{
if (str==NULL)
{
return 0;
}
if (*str != '/0')
{
return 1+NoMallocStrlen(++str);
}
else
return 0;
}
int main()
{
const char *p = "hello!";
int a = NoMallocStrlen(p);
if(a == strlen(p))
{
printf("NoMallocStrlen is well done!/n");
}
else
{
printf("Error!/n");
}
}