[問題] return pointer

看板Programming作者 (.)時間13年前 (2011/02/22 13:44), 編輯推噓0(003)
留言3則, 1人參與, 最新討論串1/1
我做了一個funtion回傳值是pointer 的練習: 輸入 abc 字串到 toUpper() 之後會印出 ABC 我想在toUpper()裡面做完轉換之後 不是回傳字串ABC 而是回傳字串的位址給 main() main()可以從回傳的位址找到轉換後的字串ABC 並且印出 我先貼上我三個錯誤的想法以及問題 文章最後有正確解答 有高手能幫我看一下 回答一下我的盲點嗎? 感謝 =================== 1. function.c: In function ‘char* toUpper(char*)’: function.c:25: warning: address of local variable ‘bbb’ returned 我設了一個bbb矩陣在toUpper()裡面暫時存放main()下來的字串 然後傳回bbb (因為按照之前我看的內容 矩陣第一個元素等同於位址) 所以回傳的bbb是位址沒錯吧 編譯結果有一個warning 輸出結果為亂碼 char *toUpper(char *ptr){ int len; int i=0; len = strlen(ptr); char bbb[len]; for(i=0;i<len;i++){ bbb[i]=toupper(*(ptr+i)); } return bbb; } =================== 2. 因為1.的錯誤 所以我再toUpper()裡面又設了一個char *newStr變數 一樣把bbb當作暫存器並且轉換後存在bbb裡面 最後再把 newStr=bbb 輸出結果一樣為亂碼 char *toUpper(char *ptr){ int len; int i=0; len = strlen(ptr); char bbb[len]; char *newStr; for(i=0;i<len;i++){ bbb[i]=toupper(*(ptr+i)); } newStr=bbb; return newStr; } ====================== 3. 因為2. 我以為是不是因為沒有讓newStr知道我的字串長度所以電腦不知道要安排多少記憶體 所以我稍微改成char *newStr=new char[len]; 一樣輸出亂碼 char *toUpper(char *ptr){ int len; int i=0; len = strlen(ptr); char bbb[len]; char *newStr=new char[len]; for(i=0;i<len;i++){ bbb[i]=toupper(*(ptr+i)); } newStr=bbb; return newStr; } =================== 正解 #include <iostream> #include <cstring> #include <cctype> using namespace std; char *toUpper(char *); int main (){ char aaa[]={"happy birthday"}; char *r; int i; r = toUpper(aaa); cout << "UPPERCASE = " << r <<endl; } char *toUpper(char *ptr){ int len; int i=0; len = strlen(ptr); char *newStr=new char[len]; for(i=0;i<len;i++){ *(newStr+i)=toupper(*(ptr+i)); } return newStr; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 69.205.68.125

02/22 14:39, , 1F
前兩個問題可見C_and_CPP置底十誡之五
02/22 14:39, 1F

02/22 14:41, , 2F
其實三個問題都是一樣的....
02/22 14:41, 2F

02/22 14:43, , 3F
另外最後的正解其實有memory leak問題
02/22 14:43, 3F
文章代碼(AID): #1DOqr0dG (Programming)