線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1009
推到 Plurk!
推到 Facebook!

程式這樣寫,會不會太龜毛,還是有比較簡潔的寫法?

尚未結案
scott777
一般會員


發表:10
回覆:15
積分:5
註冊:2002-08-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-08 15:04:00 IP:61.230.xxx.xxx 未訂閱
請問各位前輩,程式這樣寫,會不會太龜毛,還是有比較簡潔的寫法?
//---------------------------------------------------------------------------
void _CMember::SetMemberInfo(__int16 UserID,__int8 *UserName,__int8 *NickName)
{
    vu8UserName = new __int8(64);
    vu8NickName = new __int8(24);
    int len = strlen(UserName);
    len = (len>63)?63:len;
    strncpy(vu8UserName,UserName,len);
    vu8UserName[len] ='\0';
    len = strlen(NickName);
    len = (len>23)?23:len;
    strncpy(vu8NickName,NickName,len);
    vu8NickName[len] ='\0';
    vu16UserID = UserID;
    bHaveSetInfo = true;
}
//---------------------------------------------------------------------------
發表人 - scott777 於 2004/01/08 17:13:46 發表人 - scott777 於 2004/01/08 19:49:44
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-09 02:02:36 IP:211.74.xxx.xxx 未訂閱
他這一段程式碼並不是什麼龜毛不龜毛..而是故意在佈移陣, 這牽扯到系統安全的東西,你不寫越複雜一點,到時候人家來個反組譯, 你整個系統就掛了.當然沒有破解不了的系統,只是要給能力較差 又比較好奇的那些creaker新手困難度而已.
scott777
一般會員


發表:10
回覆:15
積分:5
註冊:2002-08-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-09 13:05:54 IP:61.230.xxx.xxx 未訂閱
這段程式是我自己寫的,其實也不是為了故佈疑陣 只是為了防止buffer發生溢位,只是我覺得這樣 寫有點囉唆,不知道有沒有更好更簡潔的程式碼 然後達到同樣的作用?
scott777
一般會員


發表:10
回覆:15
積分:5
註冊:2002-08-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-09 13:08:06 IP:61.230.xxx.xxx 未訂閱
還是說我太龜毛了,在找自己麻煩!!! 呵呵
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-09 16:10:44 IP:211.74.xxx.xxx 未訂閱
引言: 這段程式是我自己寫的,其實也不是為了故佈疑陣 只是為了防止buffer發生溢位,只是我覺得這樣 寫有點囉唆,不知道有沒有更好更簡潔的程式碼 然後達到同樣的作用?
喔..我還以為你是在哪看到這一段程式碼在詢問.. 變數單位這樣似乎怪怪的.. 你那個是字串,幹嘛不直接使用 char *buffer就好? __int8 根本不是 char 而是 int, 用 strlen() 好像結果不會正確吧?? 而且你是在用 BCB,那更不用這麼麻煩..就直接用 AnsiSting 這樣就好了.. 幫你把程式碼修改一下: 在 class { String vu8UserName, vu8NickName; }; void _CMember::SetMemberInfo( int UserID,String UserName, String NickName) { vu8UserName = UserName; vu8NickName = NickName; } 這樣就完成你的任務了.. 另外你的程式碼有錯誤, strlen 應該在第一行才對.. 取得字串長度後,直接配所需的記憶體即可, 而不是先分配記憶體的大小,再看分配的記憶體是不是太小了.
scott777
一般會員


發表:10
回覆:15
積分:5
註冊:2002-08-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-09 16:32:38 IP:61.230.xxx.xxx 未訂閱
很感謝你的回答,用__int8是為了跟其他程式的型態保持一致,所以才這麼做 還有就是strlen是正確的,其實__int8跟char是一樣的都是1個byte,所以沒差別 不用AnsiString是因為方便以後平台的移植,用string或許是比較好的做法 但是因為有欄位大小的限制,所以一開始就定死了...這應該是一個缺點
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-09 18:56:42 IP:211.74.xxx.xxx 未訂閱
引言: 很感謝你的回答,用__int8是為了跟其他程式的型態保持一致,所以才這麼做 還有就是strlen是正確的,其實__int8跟char是一樣的都是1個byte,所以沒差別 不用AnsiString是因為方便以後平台的移植,用string或許是比較好的做法 但是因為有欄位大小的限制,所以一開始就定死了...這應該是一個缺點
如果你考慮的是什麼跨平台的問題..那太好解決了.. 請在程式碼(??.h)最上方加上這一行(給你一個功課: 下面這一行該如何改進? 因為多檔重複include同樣的h檔會有重複定義問題發生,請自己找答案解決) #define MYUNIT char 然後你的程式碼把 __int8 全部改為 MYUNIT 這個關鍵字 例如: void _CMember::SetMemberInfo(__int16 UserID,MYUNIT *UserName,MYUNIT *NickName); 以後你到了別的平台,就只需修改 #define MYUNIT 這一行就好了. ============================================ 另外你擔心的問題,是不會發生的,char到那個平台都代表 1 byte. 只有 int 這個單位才會隨著系統的位元單位而變更..請安心使用吧!!
scott777
一般會員


發表:10
回覆:15
積分:5
註冊:2002-08-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-09 19:11:52 IP:61.230.xxx.xxx 未訂閱
引言: 如果你考慮的是什麼跨平台的問題..那太好解決了.. 請在程式碼(??.h)最上方加上這一行(給你一個功課: 下面這一行該如何改進? 因為多檔重複include同樣的h檔會有重複定義問題發生,請自己找答案解決) #define MYUNIT char
#ifndef MY_CHECK
#define MY_CECHK
#define MYUNIT  char    #endif
Right? 呵呵 我指的跨平台問題其實是使用AnsiString的問題 我寫class的時候盡量不要用到跟平台有關的物件 盡量使用stl去解決 感謝你!!!
系統時間:2024-05-18 19:16:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!