2013-05-07 136 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策略,每次将容量加倍。

希望这会有所帮助。