2013-05-07 5 views
1

Кодировщик MFC хочет узнать некоторые основные сведения о символьном массиве и инициализировать элемент element.Take следующие примеры сравниваются с MFC (есть CString, поэтому нет необходимости в распределении памяти или распределении, но то же самое необходимо в c.) (не станд :: строковый интерфейс)Изменение размера массива символов в 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) Код будет работать нормально до моего полукокса * размер constructString меньше, чем 20000, но когда он превышает я не у вас есть решение, как изменить размер массива, чтобы он принимал больше charecters.

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);  
} 

Размер файла Whitever File будет работать нормально.

Для 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, тогда массив символов * * не будет заполняться должным образом и наоборот.


Просьба предоставить мне любую ссылку, блок кода, рекомендации, которые помогают мне решить все проблемы в чистом C.

+2

'new char [1000]' не 'C'. Возможно, вам захочется взглянуть на 'realloc', не уверен, что для него эквивалентно' C++'. – Rohan

+0

Я уже прошел через это, но есть ли у вас какой-нибудь пример? – user1035089

+0

Как указано, 'new' является' cpp'. Если вам нужно использовать 'new', посмотрите [this] (http://stackoverflow.com/questions/4737226/regrow-memory-allocated-by-operator-new) обсуждение для ur 1-го qn. –

ответ

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, как сделать reintialise массив массива charecter. – user1035089

0

Вы можете создать вектор символов с переменной длиной в C, скопировав поведение std::string.

Я дал полный исходный код в ответ на этот вопрос question.

В принципе, вам нужно создать различные функции (String_add, String_getLine, String_delete ...) вокруг структур, которые будут содержать указатель на символ вектор, размер и емкость. Чтобы минимизировать количество распределений памяти, вы можете следовать стратегии std::string, удваивая емкость каждый раз.

Надеюсь, это поможет.

Смежные вопросы