Re: [問題] 大家好 關於字串反轉

看板C_and_CPP作者 (高髮箍)時間12年前 (2013/02/18 17:50), 編輯推噓7(705)
留言12則, 11人參與, 最新討論串2/4 (看更多)
※ 引述《tobashi ()》之銘言: : 大家好 今天我想用函數來做字串反轉 : #include <stdio.h> : #include <string.h> : void reverse(char* str) : { : int i, j; : char temp; : for(i=0, j = strlen(str)-1; i<j; ++i, --j) : temp = str[i], str[i]=str[j], str[j]=temp; : } : int main() : { : char * str=(char *)malloc(5*sizeof(char)); : *str="12345"; : reverse(str); : puts(str); : return 0; : } : 每次輸出都是錯誤 : 想請問問題是出在哪呢 : 謝謝 強烈建議初學者一定要學的語言feature: typedef 首先先這樣: typedef char* String; 型態中如果有 * 出現, 表示它掌握著某種資源, 1) 取得資源透過函式 2) 釋放資源透過函式 3) 任何存取也都透過函式 這是一個規範, 確保你在更高的層面下編程, 思考人類應該思考的問 題, 而不是變成像寫組合語言一樣. 標準函式庫中, 符合上述情形的 剛好就有一個例子(雖然不是很好): FILE * output = fopen( "output.txt", "w" ); fprintf( output, "hello world\n" ); fclose( output ); for (1) and (2) 我們至少需要兩個函式可以讓 String 變數能像 FILE* 變數有一套標準的操作方法: String create_string( size_t max_length ) { String ret = (String)malloc(max_length+1); return ret[ 0 ] = '\0', ret; } void release_string( String target ) { free( target ); } 在這兩個函式中, 你想要直接當它是 char* 來使用, 或是把 String 當成是未知的型別叫用其他 helper 幫我們完成任務也行. 除此之外 不是屬於上述 (3) 的函式者, 都不該知道它實際上就是 char*. 目前我覺得設計可以朝向 "String 可以和 C-style string 相容", 所以可以添加下面幾個例外: for 每一個 String 物件 str, 可以允許以下操作: (1) str[ i ] 取出 str 中第 i 個字元的參考, 字元型別是 char (2) strcpy( str, "hello" ) 將 "hello" 的內容拷貝到 str 中 (3) 像 strlen(), puts() 等可以針對 C-style string 做操 作的標準函式庫函式也可以像對 C-style string 一樣存 取 str 有了上述的幾個規則, 我們往後只要遵循它不要偷吃步, 就可以無 憂無慮的寫程式. main() 經改寫變成這樣: int main() { String str = create_string( 5 ); strcpy( str, "12345" ); reverse( str ); puts( str ); release_string( str ); return 0; } 這裡是 reverse() 的程式碼: void reverse( String str ) { size_t left = 0, right = strlen(str)-1; for ( ; left < right; ++left, --right ) { char temp = str[left]; str[left] = str[right]; str[right] = temp; } } -- 儘量不要在程式碼裡出現太多 char, int, double, 或指標等型别, 那 表示你不知道自己處理的問題是什麼, 使用 typedef 取代. 如果想不出 對於這個 typedef 出來的新型態該設計哪些存取用的函式, 那表示你 目沒看懂要回去再罰看一次. 上面說的這些其實一點也不複雜, 就只是訂了一套規則之後死忠的遵循 它而已, 以後當你要設計一個函式庫的時候, 這還只是基本招保護自己 /別人 免改太多程式碼. 寫完就這樣了, debug 都不用. -- ★ ★ ███ ███ █▌█ ██◣ ███ ▋▋█ █▂█ █▃█ ███ █▆█ █▄█ ███ █ ◣ █ █ ▋██ █▆◤ ███ ███ Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook φwindyhorse No Eul Oh Seung A Jung Yoon Hye -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.221.215 ※ 編輯: loveme00835 來自: 140.121.221.215 (02/19 01:57)

02/19 02:26, , 1F
跪~~~
02/19 02:26, 1F

02/19 03:05, , 2F
推 把事情切割乾淨對開發跟維護都有好處
02/19 03:05, 2F

02/19 03:17, , 3F
大大好文我推
02/19 03:17, 3F

02/19 13:03, , 4F
有神快拜 超清楚的 感恩
02/19 13:03, 4F

02/19 14:32, , 5F
這看起來比較像物件導向的寫法誒~ 先拜<(_ _)>
02/19 14:32, 5F

02/19 17:51, , 6F
size_t是什麼意思呢?為什麼不用int呢@@
02/19 17:51, 6F

02/19 18:05, , 7F
size_t = uint,因為大小不會有負數
02/19 18:05, 7F

02/19 19:18, , 8F
謝謝大大指教
02/19 19:18, 8F

02/19 21:04, , 9F
想請問 return ret[0]='\0' 是將結尾放在第一個?
02/19 21:04, 9F

02/19 22:36, , 10F
還不算是物件導向, 只是簡單的抽象化, 用介面隱藏實作
02/19 22:36, 10F

02/19 23:41, , 11F
物件導向算是種抽象化吧~
02/19 23:41, 11F

02/20 18:35, , 12F
要5個空間 竟然丟超過五個字元給他 也可以過 好神奇 35
02/20 18:35, 12F
文章代碼(AID): #1H8cdINK (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1H8cdINK (C_and_CPP)