Discussion:
請問 C 的動態字串函式庫
(时间太久无法回复)
昏睡在頑石上的魚
2005-03-06 10:34:54 UTC
Permalink
C 語言對字串處理都要先宣告大小,但對不確定大小的就比較
費工夫處理,像 fgets,strcpy,sprintf ... 等等。
有專門給 C 用的動態長度字串處理函式庫嗎?
我想偷懶一下,參考別人現成的。別叫我用 C++ 的 Class String 啦,
我的程度只到 C 而已,還沒到 C++。
malloc 一塊您需要大小的 memory,然後再 cast 成 char。
這個方式適合您嗎??但是記得用完要 free 掉唷,不然可是會
出現 memory leak 的。

--
天地無數有情事
  世間滿眼無奈人
 得即高歌失且休
   笑談人生一瞬間
--
* Post by hardstone from 61-59-253-18.adsl.static.seed.net.tw
* Origin: ★ 交通大學資訊科學系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>
曾小白
2005-03-07 11:59:07 UTC
Permalink
Post by 昏睡在頑石上的魚
C 語言對字串處理都要先宣告大小,但對不確定大小的就比較
費工夫處理,像 fgets,strcpy,sprintf ... 等等。
有專門給 C 用的動態長度字串處理函式庫嗎?
我想偷懶一下,參考別人現成的。別叫我用 C++ 的 Class String 啦,
我的程度只到 C 而已,還沒到 C++。
malloc 一塊您需要大小的 memory,然後再 cast 成 char。
這個方式適合您嗎??但是記得用完要 free 掉唷,不然可是會
出現 memory leak 的。
謝謝喔!我知道這個辦法,我舉個例子來說好了:

int c;
char *dynaStringA, *dunaStringB;
char *cp;

dynaStringA = (char *)malloc(??SIZE_NUMBER??);
cp=dynaStringA;

dynaStringB = (char *)malloc(??SIZE_NUMBER??);

/* 取得不固定長度的使用者輸入字串 */
while ((c=getchar()) != '\n')
{
*cp=c;
cp++;
}
*cp='\0';

int sprintf(dynaStringB, "使用者的輸入資料是: %s", dynaStringA);

像上面的例子,如果我們無法事先得知使用者輸入字串有多長,
那 dynaStringA 和 dynaStringB 在 malloc 該宣告多大呢?
萬一套用在標準輸入是長度不固定的文字檔呢?

其實基本的 C 用法我知道,我只是想問一下對於不固定長度字串處理,
是否有比較通行,大家一致接受的擴充函式庫。免得我自己搞一套,
和別人格格不入。
Vampire at Wicked Empire
2005-03-07 04:42:53 UTC
Permalink
Post by 曾小白
int c;
char *dynaStringA, *dunaStringB;
char *cp;
dynaStringA = (char *)malloc(??SIZE_NUMBER??);
cp=dynaStringA;
dynaStringB = (char *)malloc(??SIZE_NUMBER??);
/* 取得不固定長度的使用者輸入字串 */
while ((c=getchar()) != '\n')
{
*cp=c;
cp++;
}
*cp='\0';
int sprintf(dynaStringB, "使用者的輸入資料是: %s", dynaStringA);
像上面的例子,如果我們無法事先得知使用者輸入字串有多長,
那 dynaStringA 和 dynaStringB 在 malloc 該宣告多大呢?
萬一套用在標準輸入是長度不固定的文字檔呢?
其實基本的 C 用法我知道,我只是想問一下對於不固定長度字串處理,
是否有比較通行,大家一致接受的擴充函式庫。免得我自己搞一套,
和別人格格不入。
你可以用 asprintf就不需要自己 alloc string,只是要自己 free string,


如果是一般的 user program, string 大部分 在 1024 以內,
用 local variable char str[1024] 就可以了
在 read 時要限制大小,另外,sprintf 要改成 snprintf以避免 overflow,
--
My projects:
http://www.csie.nctu.edu.tw/~cp76/gcin
http://fftv.sf.net
http://tcron.sf.net
http://www.csie.nctu.edu.tw/~cp76/gcb
曾小白
2005-03-09 12:15:25 UTC
Permalink
Post by Vampire at Wicked Empire
Post by 曾小白
int c;
char *dynaStringA, *dunaStringB;
char *cp;
dynaStringA = (char *)malloc(??SIZE_NUMBER??);
cp=dynaStringA;
dynaStringB = (char *)malloc(??SIZE_NUMBER??);
/* 取得不固定長度的使用者輸入字串 */
while ((c=getchar()) != '\n')
{
*cp=c;
cp++;
}
*cp='\0';
int sprintf(dynaStringB, "使用者的輸入資料是: %s", dynaStringA);
像上面的例子,如果我們無法事先得知使用者輸入字串有多長,
那 dynaStringA 和 dynaStringB 在 malloc 該宣告多大呢?
萬一套用在標準輸入是長度不固定的文字檔呢?
其實基本的 C 用法我知道,我只是想問一下對於不固定長度字串處理,
是否有比較通行,大家一致接受的擴充函式庫。免得我自己搞一套,
和別人格格不入。
你可以用 asprintf就不需要自己 alloc string,只是要自己 free string,
十分感謝!
man 了一下 asprintf ,發覺是 GNU extensions, not in C or POSIX.
怪不得我在坊間的 C 參考手冊找不到,看來只能在 Linux 這類的 OS 下用,
可攜性不足了。
Post by Vampire at Wicked Empire
如果是一般的 user program, string 大部分 在 1024 以內,
用 local variable char str[1024] 就可以了
在 read 時要限制大小,另外,sprintf 要改成 snprintf以避免 overflow,
魔法ABC
2005-03-08 23:04:19 UTC
Permalink
regards:

小小我請教一下,memory leak是用來做啥的?...@@.
如果我的DRAM記憶體夠大,
一定要free掉嗎?...@@.

抱歉,我是程式新手...@@.



Any positive suggestion is welcome.
thank you
May goodness be with you all

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.138.137.177
Vampire at Wicked Empire
2005-03-09 07:28:13 UTC
Permalink
Post by 魔法ABC
如果我的DRAM記憶體夠大,
如果只是短暫執行一下的就沒有關係,如果是執行很久的就不太好。
其實如果養成用完就馬上 free 的習慣,用 valgrind 等 tool 就可以幫你檢查有沒有
free memory read 的問題。
--
My projects:
http://www.csie.nctu.edu.tw/~cp76/gcin
http://fftv.sf.net
http://tcron.sf.net
http://www.csie.nctu.edu.tw/~cp76/gcb
曾小白
2005-03-09 15:49:05 UTC
Permalink
Post by 魔法ABC
如果我的DRAM記憶體夠大,
你不能永遠假定你的程式擁有足夠大的記憶體,除非你的程式永遠只有自己用。
WaterMelonPie
2005-03-09 11:39:53 UTC
Permalink
Post by 曾小白
Post by 魔法ABC
如果我的DRAM記憶體夠大,
你不能永遠假定你的程式擁有足夠大的記憶體,
除非你的程式永遠只有自己用。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

good answer!!!!!



--
好康訊息!
Openfind 提供免費撥接電話:40508888
帳號:openfind 密碼:openfind
--
http://bbs.openfind.com.tw
※來源:61.152.*
s***@kkcity.com.tw
2005-03-10 00:50:18 UTC
Permalink
Post by WaterMelonPie
Post by 曾小白
你不能永遠假定你的程式擁有足夠大的記憶體,
除非你的程式永遠只有自己用。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
good answer!!!!!
如果使用上增加的速度不快
事實上可以不用管
但是 最好還是注意下

如果狂alloc mem給程式
linux還是會掛點的
就算不是root 還有掛點是以"不能動"稱為掛點
不要跟我說等個幾天就會恢復這種話=.=||
說真的 我倒是蠻想知道有啥方法可以限制使用者使用記憶體的
--
┌─────◆KKCITY◆─────┐KKMAN團隊  全新力作 ◎◎KKBOX◎◎
│ bbs.kkcity.com.tw │知名歌手通通都有  所有新歌想聽就聽
└──《From:61.224.76.24 》──┘※※ 內容豐富多元的線上音樂台 ※※
Vampire at Wicked Empire
2005-03-10 01:20:08 UTC
Permalink
Post by s***@kkcity.com.tw
不要跟我說等個幾天就會恢復這種話=.=||
說真的 我倒是蠻想知道有啥方法可以限制使用者使用記憶體的
用 ulimit -v 看看
--
My projects:
http://www.csie.nctu.edu.tw/~cp76/gcin
http://fftv.sf.net
http://tcron.sf.net
http://www.csie.nctu.edu.tw/~cp76/gcb
继续阅读narkive:
Loading...