2013-05-07 115 views
1

MFC編碼器想要學習一些關於字符數組初始化和刪除元素的基本知識。以下示例與MFC比較(有CString,因此不需要內存分配或分配,但需要在c中)。 ) (沒有的std :: string接口)調整字符數組的大小c

例1: -

構建串擺在我們下面的MFC代碼。

CString constructString;  
constructString = "";  
constructString = "ABC";  
constructString = constructString + "PQR";  
constructString = constructString + "LMN"; 

無論字符串的大小,我們都有這個工作。

對於C,我用下面的代碼

#define DEFAULT_ARRAY_SIZE   20000  
char* constructString = new char[DEFAULT_ARRAY_SIZE];  
strcpy(constructString ,"");  
strcat(constructString ,"ABC");  
strcat(constructString ,"PQR");  
strcat(constructString ,"LMN"); 

問題: -

1)代碼將正常工作,直到我的char * constructString大小小於20000,但是當它超過我不有解決方案,如何調整我的數組,這將需要更多的人物。

2)我初始化char * constructString與20000,但是當我的字符串是非常小的大小10,然後我剩餘的18990人物浪費或不知道,這會影響我的可執行性能。如果是,那麼如何刪除我的其餘的虛擬人物。

例2: -

要閱讀我們用下面的MFC代碼文件的內容。

CStdioFile ReadFile;  
ReadFile.Open("Sample.txt",CFile::typeText|CFile::Read);  
CString CurrentString;  
CStringArray WholeFile;  
while(ReadFile.ReadString(CurrentString))  
{  
    WholeFile.Add(CurrentString);  
} 

文件大小它會正常工作。

對於C我用下面的代碼

#define MAX_FILE_SIZE    65534  
FILE *ptr_file;  
const char* list[MAX_FILE_SIZE];  
wchar_t CurrentString[1000];  
ptr_file =fopen("Sample.txt","rb");  
int __index = 0;  
while(fgetws (CurrentString , 1000 , ptr_file) != NULL)  
{  
    char* errorDes;  
    errorDes = new char[1000];  
    wcstombs(errorDes, CurrentString, 1000);  
    list[__index] = errorDes;  
    __index++;  
} 

問題: -

1)同上,如果我的一行charecters超過1000然後超過1000個charecters不考慮和臺鉗反之亦然。

2)如果我的文件大小超過65534,那麼char * list數組將不會正確填充,反之亦然。


請給我提供任何鏈接的代碼塊,建議,幫助我解決所有問題,在純C.

+2

'new char [1000]'不是'C'。你可能想看看'realloc'不知道什麼是'C++'等價物。 – Rohan 2013-05-07 12:05:40

+0

我已經通過了,但你有任何例子嗎? – user1035089 2013-05-07 12:10:35

+0

正如所指出的,'new'是'cpp'。如果您需要使用'new',請查看[this](http://stackoverflow.com/questions/4737226/regrow-memory-allocated-by-operator-new)針對您的第一個qn的討論。 – 2013-05-07 12:17:15

回答

0

在C

#define DEFAULT_ARRAY_SIZE   20000 
    #define NEW_SIZE     20100 

    char* constructString = (char *)malloc(DEFAULT_ARRAY_SIZE * sizeof(char)); 
    // Now you have the array allocated 

    // To reallocate it: 
    constructSring = (char *)realloc (construcString, NEW_SIZE) 

    // Now you can assign new values into the new array positions: 
    constructString[20000] = 'a' 
    constructString[20001] = 'b' 
    constructString[20002] = 'c' 
    ... 

我希望這有助於你

+0

nop,我如何重新構造陣列數組。 – user1035089 2013-05-08 06:05:15

0

您可以用C創建一個可變長度的字符向量,複製std::string的行爲。

我給了這個question的答案完整的源代碼。

基本上,您需要創建圍繞結構的各種函數(String_add,String_getLine,String_delete ...),該結構將指針指向char向量,大小和容量。爲了最大限度地減少內存分配的數量,您可以遵循std::string策略,每次將容量加倍。

希望這會有所幫助。