【发布时间】:2013-05-01 09:00:24
【问题描述】:
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* 构造字符串大小小于 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 语言中的所有问题。
【问题讨论】:
-
new char[1000]不是C。你可能想看看realloc不确定C++的等价物是什么。 -
我已经经历过了,但你有什么例子吗??
-
正如所指出的,
new是cpp。如果您需要使用new,请查看this 讨论您的第一个问题。 -
我想用 new 和 malloc 代替 std::vector
-
您使用的是 C 还是 C++?在 C 中你不能使用 new,它不存在。如果你想使用 malloc,你必须“手动”做任何事情,也就是说,如果缓冲区变得太小,那么你必须把它变大,例如使用 realloc 函数。