【问题标题】:Resizing character array in c在c中调整字符数组的大小
【发布时间】: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++ 的等价物是什么。
  • 我已经经历过了,但你有什么例子吗??
  • 正如所指出的,newcpp。如果您需要使用new,请查看this 讨论您的第一个问题。
  • 我想用 new 和 malloc 代替 std::vector
  • 您使用的是 C 还是 C++?在 C 中你不能使用 new,它不存在。如果你想使用 malloc,你必须“手动”做任何事情,也就是说,如果缓冲区变得太小,那么你必须把它变大,例如使用 realloc 函数。

标签: c++ arrays winapi char


【解决方案1】:

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

希望对你有帮助

【讨论】:

    【解决方案2】:

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

    我在回复question时给出了完整的源代码。

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 2016-02-22
      • 2017-01-14
      • 1970-01-01
      • 2016-05-02
      • 2019-10-07
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多