1

MFC 编码员想要学习一些关于字符数组初始化和删除元素的基本知识。将以下示例与 MFC 进行比较(有 CString,因此不需要内存分配或取消分配,但在 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* 构造字符串大小小于 20000,但是当它超过我没有解决方案时,如何调整我的数组大小以便它需要更多的字符。

2)我用 20000 初始化 char* 构造字符串,但是当我的字符串非常小的大小为 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);    
}

文件的 Whitever 大小可以正常工作。

对于 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) 同上,如果我的一行字符超过 1000,则不考虑超过 1000 个字符,反之亦然。

2)如果我的文件大小超过 65534,那么 char* 列表数组将无法正确填充,反之亦然。


请向我提供任何链接、代码块、建议,以帮助我解决纯 C 语言中的所有问题。

4

2 回答 2

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'
    ...

我希望这可以帮助你

于 2013-05-07T12:44:02.770 回答
0

您可以在 C 中创建一个可变长度的字符向量,复制std::string.

我在回答这个问题时给出了完整的源代码。

基本上,您需要围绕一个结构创建各种函数(String_add, String_getLine, String_delete...),该结构将保存指向 char 向量的指针、大小和容量。为了尽量减少内存分配次数,可以按照std::string策略,每次加倍容量。

希望这可以帮助。

于 2013-05-07T12:52:25.370 回答