Задать вопрос
@ShantMnac

Куда потерялся байт?

Вопрос такой: пропадает байт памяти, не могу отловить. Помогите, пожалуйста

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define NAMELEN 256

void sortStrings();
void writeStrings(char**, FILE*);
void graph(FILE*, int);
int cmpStrings(char*, char*);
char **readString();

int counterForStrings = 0;
int nFlag = 1;

struct charRate{
    char ch;
    double rate;
};

int main(int argc, char *argv[]){
    int screenWidth, i;
    char fileName1[NAMELEN], fileName2[NAMELEN], **arrayOfStrings;
    FILE *input, *output;
    if ((argc > 1)){
        if (argc == 4){
            
            input = fopen(argv[1], "rb");
            if (input == NULL) {
                printf("Input file does not exist!\n");
                exit(1);
            }
            
            output = fopen(argv[2], "wb");
            if (output == NULL) {
                printf("Output file does not exist!\n");
                exit(1);
            }
            
            screenWidth = atoi(argv[3]);
            if (screenWidth <= 0){
                printf("The width should be positive!\n");
                exit(1);
            }
        }
        else{
            printf("Wrong number of parameters!\n");
            return 0;
        }
    }
    else {
        printf("Enter input file name\n>");
        scanf("%s", fileName1);
        input = fopen(fileName1, "rb");
        if (input == NULL) {
            printf("This file does not exist!\n");
            exit(1);
        }
        
        printf("Enter output file name\n>");
        scanf("%s", fileName2);
        output = fopen(fileName2, "wb");
        if (output == NULL) {
            printf("This file does not exist!\n");
            exit(1);
        }
        
        printf("Enter screen width\n>");
        scanf("%i", &screenWidth);
        if (screenWidth <= 0){
            printf("The width should be positive!\n");
            exit(1);
        }
    }
    
    arrayOfStrings = readString(input);
    if (counterForStrings == 0) {
        printf("Input file is empty!\n");
        return 1;
    }
    sortStrings(arrayOfStrings);
    writeStrings(arrayOfStrings, output);
    graph(input, screenWidth);
    
    for (i=0; i<=(counterForStrings-1); i++) {
        free(arrayOfStrings[i]);
    }
    free(arrayOfStrings);
    fclose(input);
    fclose(output);
    return 0;
}

void graph(FILE *inputFile, int width){
    char temp;
    int arrCounter = 0, i, j, simFlag = 0, max = 0;
    struct charRate *charArray = NULL;
    fseek(inputFile, 0L, 0);
    do{
        fread(&temp, sizeof(char), 1, inputFile);
        if (feof(inputFile)) {
            break;
        }
        for (i=0; i<=(arrCounter-1); i++){
            if (temp == charArray[i].ch) {
                simFlag = 1;
                charArray[i].rate++;
                break;
            }
        }
        if (!simFlag) {
            arrCounter++;
            charArray = (struct charRate*)realloc(charArray, arrCounter * sizeof(struct charRate));
            charArray[arrCounter-1].ch = temp;
            charArray[arrCounter-1].rate = 1;
        }
        simFlag = 0;
    }while (!feof(inputFile));
    
    for (i=0; i<=(arrCounter-1); i++) {
        if (charArray[i].rate > max){
            max = charArray[i].rate;
        }
    }
    
    printf("\n");
    
    for (i=0; i<=(arrCounter-1); i++) {
        if (((int)charArray[i].ch <= 32) || ((int)charArray[i].ch == 127)) {
            printf("#%i\t\t|%i\t|", (int)charArray[i].ch, (int)charArray[i].rate);
        }
        else{
            printf("%c\t\t|%i\t|", charArray[i].ch, (int)charArray[i].rate);
        }
        
        for (j = 1; j<=(charArray[i].rate/max*width); j++) {
            
            printf("*");
        }
        printf("\n");
    }
    printf("\n");
    
    free(charArray);
}

char **readString(FILE *inputFile){
    int counterForChars = 0, charFlag = 0;
    char temp = '!', enter = '\n', *arrayOfChars = NULL, **arrayOfStrings = NULL;
    do{
        while(temp != '\n'){
            fread(&temp, sizeof(char), 1, inputFile);
            counterForChars++;
            arrayOfChars = (char*)realloc(arrayOfChars, counterForChars * sizeof(char));
            if (arrayOfChars == NULL) {
                printf("Not enough memory");
                exit (1);
            }
            if (feof(inputFile)) {
                break;
            }
            charFlag = 1;
            arrayOfChars[counterForChars-1] = temp;
        }
        if (charFlag) {
            if (feof(inputFile)) {
                nFlag = 0;
                //arrayOfChars = (char*)realloc(arrayOfChars, counterForChars * sizeof(char));
                if (arrayOfChars == NULL) {
                    printf("Not enough memory");
                    exit (1);
                }
                arrayOfChars[counterForChars-1] = enter;
                
            }
            else{
                charFlag = 0;
                counterForChars = 0;
                temp = '!';
            }
            counterForStrings++;
            arrayOfStrings = (char**)realloc(arrayOfStrings, counterForStrings * sizeof(char*));
            if (arrayOfStrings == NULL) {
                printf("Not enough memory");
                exit (1);
            }
            arrayOfStrings[counterForStrings-1] = arrayOfChars;
            arrayOfChars = NULL;
        }
    }while (!(feof(inputFile)));
    
    return arrayOfStrings;
}


void sortStrings(char **arrayOfStrings){
    int sortCounter = 0;
    char *tempString;
    while((sortCounter + 1) != counterForStrings){
        if (cmpStrings(arrayOfStrings[sortCounter], arrayOfStrings[sortCounter+1])) {
            sortCounter++;
        }
        else{
            tempString = arrayOfStrings[sortCounter];
            arrayOfStrings[sortCounter] = arrayOfStrings[sortCounter+1];
            arrayOfStrings[sortCounter+1] = tempString;
            sortCounter = 0;
        }
    }
};

int cmpStrings(char *firstString, char *secondString){  //1 - арг1<арг2, 0 - арг1>арг2
    int i = 0;
    while ((firstString[i] != '\n') && (secondString[i] != '\n')) {
        if (firstString[i] == secondString[i]) {
            i++;
        }
        else {
            if (firstString[i] < secondString[i]){
                return 1;
            }
            else {
                return 0;
            }
        }
    }
    if (firstString[i] == '\n') {
        return 1;
    }
    else {
        return 0;
    }
}


void writeStrings(char **stringArray, FILE *outputFile){
    int i=0, j;
    char enter = '\n';
    if (nFlag)
        for (j=0; j<=(counterForStrings-1); j++){
            while (stringArray[j][i] != '\n') {
                fwrite(&(stringArray[j][i]), sizeof(char), 1, outputFile);
                i++;
            }
            fwrite(&enter, sizeof(char), 1, outputFile);
            i = 0;
        }
    else {
        for (j=0; j<=(counterForStrings-2); j++){
            while (stringArray[j][i] != '\n') {
                fwrite(&(stringArray[j][i]), sizeof(char), 1, outputFile);
                i++;
            }
            fwrite(&enter, sizeof(char), 1, outputFile);
            i = 0;
        }
        j = (counterForStrings - 1);
        i = 0;
        while (stringArray[j][i] != '\n') {
            fwrite(&(stringArray[j][i]), sizeof(char), 1, outputFile);
            i++;
        }
    }
}
  • Вопрос задан
  • 198 просмотров
Подписаться 2 Оценить 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Предлагаете угадать где именно он пропадает и что значит "пропадает"?
Ответ написан
Вопрос поставлен странно как-то: Вы даете код, относительно большой, и просите найти ошибку. Вас учить пользоваться gdb и пошаговой отладкой?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы