调整字符数组的大小

Resizing character array in c

本文关键字:数组 字符 调整      更新时间:2023-10-16

一个MFC编码器想学习一些关于字符数组初始化和元素删除的基本知识。以以下示例与MFC进行比较(有CString,因此不需要内存分配或取消分配,但在c中需要相同。)(没有std::string接口)

示例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)我用20000初始化char* constructString,但是当我的字符串非常小的大小为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)和上面一样,如果我的一行字符超过1000个,那么超过1000个字符不考虑,反之亦然。

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


请提供给我任何链接,代码块,建议,帮助我解决纯c中的所有问题

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

希望这对你有帮助

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

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

基本上,你需要在一个结构体周围创建各种函数(String_add, String_getLine, String_delete…),该结构体将保存指向char向量的指针,大小和容量。为了最小化内存分配的数量,您可以遵循std::string策略,每次将容量增加一倍。