生活随笔
收集整理的這篇文章主要介紹了
一面微创题--字符串逆序输出
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?????最近一直在等面試消息,都有點(diǎn)著急了,的確,還有太多不足,筆面之后的一面技術(shù)面,幸運(yùn)地是在三個(gè)面試者中面試官留下了我,可是一句話又搞的我一點(diǎn)底都沒了:“你別以為你通過了就怎么著,其實(shí)你也很菜,你寫的程序不過就是讓我大概看懂了罷了。”可不,趁現(xiàn)在等消息好好想想寫的那程序得了。當(dāng)時(shí)一看題目感覺挺簡單的,字符串逆序很容易實(shí)現(xiàn)吶。
????? 實(shí)現(xiàn)要求是至多只能申請一個(gè)空間,不能用庫函數(shù)。當(dāng)時(shí)面試的時(shí)候是這樣考慮的,字符數(shù)組做函數(shù)參數(shù)傳遞,此時(shí)如果直接傳遞的話就成值傳參了,所以立馬就考慮到用二級指針。面試時(shí)寫的程序大概如下:
[c-sharp]view plaincopy
#include?<iostream>?? using?namespace?std;?? ?? void?reverse(char?**src,int?n);?? int?main(int?argc,char?**argv)?? {?? ????char?test[]?=?"I?love?you!";?? ????cout<<test<<endl;?? ????reverse(&test,sizeof(test));?? ????cout<<test<<endl;?? }?? ?? void?reverse(char?**src,int?n)?? {?? ????char?temp?=?'/0';?? ????for(int?i=0;i<n/2;i++)?? ????{?? ????????temp?=?(*src)[i];?? ????????*src[i]?=?*src[n-i-2];?? ????????*src[n-i-2]?=?temp;?? ????}?? ????*src[n-1]?=?'/0';?? ????return?;?? }??
?
可是此時(shí)編譯運(yùn)行卻出錯(cuò):“reverse”: 不能將參數(shù) 1 從“char (*)[12]”轉(zhuǎn)換為“char **”;
之后在main函數(shù)中加入:cout<<typeid(test).name()<<endl;cout<<typeid(&test).name()<<endl;發(fā)現(xiàn),test為char *類型指針,而&test為char (*)[12]類型數(shù)組指針。所以參數(shù)傳遞時(shí)明顯不匹配,數(shù)組指針不能傳向二級指針形參。修改代碼后:
[c-sharp]view plaincopy
#include?<iostream>?? using?namespace?std;?? ?? void?reverse(char?**src,int?n);?? int?main(int?argc,char?**argv)?? {?? ????char?test[]?=?"I?love?you!";?? ????????cout<<typeid(test).name()<<endl;?? ????????cout<<typeid(&test).name()<<endl;?? ????cout<<test<<endl;?? ????????char?*p?=?test;?? ????reverse(&p,sizeof(test));?? ?????????? ????cout<<test<<endl;?? }?? ?? void?reverse(char?**src,int?n)?? {?? ????char?temp?=?'/0';?? ????for(int?i=0;i<n/2;i++)?? ????{?? ????????temp?=?*src[i];?? ????????*src[i]?=?*src[n-i-2];?? ????????*src[n-i-2]?=?temp;?? ????}?? ????*src[n-1]?=?'/0';?? ????return?;?? }??
通過編譯運(yùn)行后卻又出現(xiàn)內(nèi)存錯(cuò)誤,為什么呢?
再看看reverse函數(shù),優(yōu)先級又出錯(cuò)了,*src[i];....?這個(gè)算什么呢?[]的優(yōu)先級比*高,所以首先src是與[]結(jié)合的,那再通過解引用獲得的會是什么元素,此處已經(jīng)明顯內(nèi)存溢出了。所以繼續(xù)修改:
[c-sharp]view plaincopy
void?reverse(char?**src,int?n)?? {?? ????char?temp?=?'/0';?? ????for(int?i=0;i<n/2;i++)?? ????{?? ????????temp?=?(*src)[i];?? ????????(*src)[i]?=?(*src)[n-i-2];?? ????????(*src)[n-i-2]?=?temp;?? ????}?? ????(*src)[n-1]?=?'/0';?? ????return?;?? }??
再繼續(xù)編譯運(yùn)行,總算可以將"I love you!"逆序成"!uoy evol I"了。可是下面這個(gè)程序卻讓我徹徹底底掛掉了。
[cpp]view plaincopy
#include?<iostream>?? using?namespace?std;?? ?? void?reverse(char?*src,int?n);?? int?main(int?argc,char?**argv)?? {?? ????char?test[]?=?"I?love?you!";?? ????cout<<test<<endl;?? ????reverse(test,sizeof(test));?? ????cout<<test<<endl;?? }?? ?? void?reverse(char?*src,int?n)?? {?? ????char?temp?=?'/0';?? ????for(int?i?=?0;i<n/2;i++)?? ????{?? ????????temp?=?src[i];?? ????????src[i]?=?src[n-i-2];?? ????????src[n-i-2]?=?temp;?? ????}?? ????return?;?? }??
同樣達(dá)到了字符串逆序輸出的效果。怎么感覺有點(diǎn)畫蛇添足的效果呢,函數(shù)是傳入的是值形參,盡管這個(gè)值的類型是個(gè)指針類型,但是對于這個(gè)形參和實(shí)參來說,所指向的位置是一樣的,即所操作的地址是一樣的,所以直接用數(shù)組名操作即可。哎,果然還太菜吶。
總結(jié)
以上是生活随笔為你收集整理的一面微创题--字符串逆序输出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。