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