2012-06-08 3 views
1
openFile(argv[1],"r"); 
while(characterBuff != EOF) 
{ 
    characterBuff = fgetc(examFile); 
    memoryAlloc += 1; 
    string = expandRealloc(string, memoryAlloc); 
    appendString(string, characterBuff); 
    printf("%s\n", string); 
} 
closeFile(); 
free(string); 

В следующем коде: выход я получаю от Printf дает мне ackward значения, как [somehash] D [somehash] E [somehash] S [somehash] KПечать содержимого файла

Я получаю выходное слово, которое является «DESK», но со всяким случайным дерьмом, взятым из памяти, что я делаю неправильно?

Примечание: Следующие свойства были выделены с помощью malloc (sizeof (char)) и выполняются при каждом добавлении одного символа в строку.

т.е. выход я должен получать должно быть: D De Des стол Но вместо того, что я получаю вещь я показанный U раньше.

EDIT:

char* expandRealloc(char* ptrS, size_t n) 
{ 
    void *tmp; 
    if((tmp = realloc(ptrS, n)) == NULL) 
    { 
     printf("Error: Memory leak possible; Closing Program"); 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     ptrS = tmp; 
     return ptrS; 
    } 
} 

Я написал функцию-оболочку для перераспределить. Спасибо за помощь, но она все еще не решает проблему, я все еще получаю [somecrapmemoryhash] [письмо] [somecrapmemoryhash] [письмо] при попытке распечатать результат.

APPEND STRING:

void appendString(char* inputString, int inputChar) 
{ 
    int stringLenght = strlen(inputString); 
    inputString[stringLenght - 1] = inputChar; 
    inputString[stringLenght] = '\0'; 
} 
+0

Я предполагаю, что это C/C++? –

+0

Да, это C, забыли добавить –

+3

Одна большая проблема для начала - ваш вызов realloc нарушен - посмотрите на страницу man для realloc –

ответ

4

Когда realloc называется, он может переместить выделенную память, и поэтому вы должны заменить старое содержимое указателя со значением возвращенного перераспределить.

Попробуйте

char *temp_string; 
    . 
    . 
    . 
temp_string = realloc(string, memoryAlloc); 
if(temp_string != NULL) 
    string = temp_string; 

EDIT

Это меня поражает, что большая часть проблемы здесь является использование написанных пользователем функций, чтобы делать вещи, которые уже давно были частью стандарта библиотека. Изменение этого кода для использования стандартных функций lib без использования специальных оболочек и т. Д. Было бы не более сложным и обеспечило бы большую надежность. Например, функция appendString, по-видимому, была источником многих трудностей, возникающих здесь. Если вместо этого использовалась функция strcat (с незначительными модами к источнику), можно было бы избежать большого обострения и вытягивания волос.

Стандартная библиотека есть для отличных причин. Он последовательный, прочный, отлаженный, полезный и - ну, это СТАНДАРТ. Если кто-то здесь думает, что они сами по себе умнее, чем сотни людей, которые внесли свой вклад в стандартную библиотеку, они, скорее всего, ошибаются. Если кто-то здесь думает, что они не могут ВОЗМОЖНО использовать функции из стандартной библиотеки для выполнения основных операций, потому что их потребности настолько невероятно особенны, они, скорее всего, ошибаются. Сам язык C не является особо особенным - давайте посмотрим правде в глаза, фигурные скобки не такие уж большие :-) - сила C происходит непосредственно из философии «поместить все в функцию» - то есть из использования библиотек функций для выполнения задач. Стандартная библиотека - это самая основная вещь, которую начинающим программистам нужно научиться, а ее использование должно быть второй натурой для любого опытного программиста на С.

Делитесь и наслаждайтесь.

+0

. Это приводит к утечке памяти, хотя если сбой realloc (т. Е. Возвращает NULL) - вы должны сначала присвоить результат realloc временному указателю. –

+0

@PaulR - хорошая точка - измененный пример. –

+0

Написал функцию обертки для realloc и изменил ее, но она по-прежнему не решает проблему с печатью, которая для меня является bugger. Для содержимого кода reffer для первого сообщения. –

0

Проблема с строкой печати выглядит подозрительно, как отсутствие завершения NULL в конце строки ... appendString позаботиться о добавлении терминатора?

+0

Да, он добавляет терминатор. Обратите внимание, что моя проблема не печатается: DESKfo0932jfjewf98wjef98wejf и т. Д., Но D [Psunflowersign] E [Psunflowersign] и т. Д. –

2

Ваша appendString функция неправильно - изменение:

void appendString(char* inputString, int inputChar) 
{ 
    int stringLenght = strlen(inputString); 
    inputString[stringLenght - 1] = inputChar; 
    inputString[stringLenght] = '\0'; 
} 

к:

void appendString(char* inputString, int inputChar) 
{ 
    int stringLength = strlen(inputString); 
    inputString[stringLength] = inputChar; 
    inputString[stringLength + 1] = '\0'; 
} 
+0

И я все еще получаю [weirdmemoryhash] в начале строки –

+0

Как вы инициализируете 'string' в первую очередь? Вам также нужно опубликовать код для этой части. –

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