2010-06-02 33 views
0

我可以以char數據類型存儲少量長度的字符串。以字符數據類型C語言存儲字符

但是,當它超過它的容量時,可以用什麼方法來存儲字符串。

我正在使用char數據類型。

void setString(char* inPoints) 
{ 
if (strcmp(mPoints, inPoints)!= ZERO) { 

    if (mPoints) { 

     free(mPoints); 
    } 

    mPoints = (char*)malloc((strlen(inPoints) + 1) * sizeof(char)); 

    strcpy(mPoints, inPoints); 
} 
} 
+0

你可以在'char'變量中存儲單個字符 - 對於字符串,你需要一個恰當的malloced'char *' – Amarghosh 2010-06-02 13:54:03

+1

爲什麼你會有一個叫做ZERO的符號常量?這比文字0好嗎?如果它將是符號的,它應該有意義,例如在這種情況下STRCMP_EQUAL。 – unwind 2010-06-02 14:25:18

+0

不需要在if語句中包裝'free'。 'free'接受(並忽略)NULL指針。 – tomlogic 2010-06-02 15:27:33

回答

0

用strncpy代替strcpy的是通常比較安全,但在這裏你的Alloc eachtime到入點存儲到M點所需的內存適量,所以我看不到有什麼意義。您可以在mPoint中存儲的字符串的最大長度受malloc-able內存量的限制。

添加:您可以realloc的建議,並有可能你可以在長度增加一個檢查,以避免realloc的-ING如果字符串較短;所以M點就能夠保持始終爲字符串小於最長的字符串到目前爲止滿足,或等於:


// somewhere altogether with mPoints 
size_t mPointsCurrenStorage = INITVAL; 
// e.g. INITVAL is 256, and you pre-malloc-ate mPoints to 256 chars 
// ... in the func 
size_t cl = strlen(inPoints); 
if (cl >= mPointsCurrentStorage) { 
    mPoints = realloc(mPoints, cl+1); 
    mPointsCurrentStorage = cl+1; 
} 
strcpy(mPoints, inPoints);

這樣的存儲只生長...

+0

當然我錯過了測試,以避免重新分配複製,如果字符串與已存儲的字符串相同。你可以在做任何事之前添加它。 – ShinTakezou 2010-06-02 14:16:40

+0

避免'p = realloc(p,size)'。如果'realloc'失敗,則泄露了原始指針。 – jamesdlin 2010-06-02 18:00:28

+0

是的,它不是很好的編碼,但我用它只是爲了表明這一點;所以'char * temp = realloc(mPoints,cl + 1);斷言(臨時!= NULL);可以使用mPoints = temp'; (如果不喜歡斷言,則將斷言改爲任何需要的檢查代碼) – ShinTakezou 2010-06-02 18:22:57

3

您可以分配一個新的,更大的陣列和舊的字符串複製到它(並刪除舊的,以防止內存泄漏),追加更多字符。或者(如果可能)切換到C++字符串類,這使得這個過程更容易。

+0

這是他的代碼已經做了什麼,即使他可以使用realloc來代替。 – ShinTakezou 2010-06-02 14:10:07

2

的realloc()應該調整你的字符串

+0

這是他已經做了,即使「手工」,而不是使用realloc(這是無論如何更好的解決方案)。 – ShinTakezou 2010-06-02 14:10:50

0
  • STRCMP與M點= NULL是不允許。
  • ZERO作爲一個常量?
  • free()接受NULL指針。
  • 的malloc()不需要在C.
  • 的sizeof(char)的鑄造爲1
  • 一定要檢查的malloc()的返回。

修改的版本:

void setString(char* inPoints) 
{ 
    if ((mPoints == NULL) || (strcmp(mPoints, inPoints) != 0)) 
    { 
     free(mPoints); 

     mPoints = malloc(strlen(inPoints) + 1); 

     if (mPoints != NULL) 
     { 
      strcpy(mPoints, inPoints); 
     } 
    } 
} 

而且你使用一個全局變量M點,有更好的解決方案。但是,這和malloc()= NULL的錯誤處理不在一邊,你總是分配所需的數量,那麼「超過它的容量」是什麼意思?

+0

mPoints是私人會員。 – boom 2010-06-03 04:37:20

+0

C中沒有私人成員。你在說什麼? – Secure 2010-06-03 06:35:31