Почему последняя строка неправильно вводит многомерный массив, который показывает частоту символов? - PullRequest
0 голосов
/ 11 марта 2020

Я долго пытался найти решение, но мне кажется, что я не могу.

Я пытался создать программу, которая читает предложения из файла, помещает предложения в виде строк в многомерное массив и быстро сортирует предложения массива в алфавитном порядке. Затем он помещает этот массив в другой массив, который показывает частоту букв в столбце, который показывает букву и частоту.

Например, предложение 7 «CUD» должно быть строкой 7 и иметь 1,1 и 1 в столбцах 3 (c) 4 (d) и 21 (U). Это работает отлично, за исключением последнего предложения, которое по какой-то причине вообще не вводится и показывает случайные числа.

void isAnAnagram(char anagramTester[][MAX_CHAR]) {
int countLetters[MAX_LINES][26] = {0};
int x;
for (int i =1; i <=MAX_LINES; i++) {
    for (int j = 0; (anagramTester[i][j] != '\0'); j++) {
        if (anagramTester[i][j] >= 'a' && anagramTester[i][j] <= 'z') {
            x = anagramTester[i][j] - 'a' +1;
            countLetters[i][x]++;
        } else if (anagramTester[i][j] >= 'A' && anagramTester[i][j] <= 'Z') {
            x = anagramTester[i][j] - 'A' +1;
            countLetters[i][x]++;
        }
    }
}
for(int i=1;i<=MAX_LINES;i++){ //Rows
    printf("row:%d ", i);
    for(int j=1;j<=26;j++){ //Cols

        printf("%d ",countLetters[i][j]);
    }
    printf("\n");
}}

Это функция, которая принимает двумерный массив со строками в нем, который я пытался изменить циклы, но принципиально я не знаю, почему эта ошибка возникает только в последнем предложении.

здесь есть функция ввода и вывода файла

    void readSentences(char inputSentences[][MAX_CHAR]){
int lineNum = 0;
FILE *fp = fopen("YOurDETAILS/input.txt", "r+");
fseek(fp, 0, SEEK_SET);
if(fp== NULL ){
    /* check does weather file exist etc*/
    perror("Error opening file");
    lineNum = -1;
    /* use this as a file not found code */
}
else {
    // fgets returns NULL when it gets to the end of the file
    for(lineNum = 1; lineNum <= MAX_LINES; lineNum++){
        if(fgets(inputSentences[lineNum], MAX_CHAR, fp) != NULL){
            inputSentences[lineNum][MAX_CHAR] = '\0';
        }
        else {
            inputSentences[lineNum][MAX_CHAR] = '\0';

            fclose(fp);
        }
        inputSentences[MAX_LINES][MAX_CHAR] = '\0';
    }


    }
    }

  void writeAnswer(char output[][MAX_CHAR]){
    FILE *fp = fopen("YOurDETAILS/output.txt", "w");
    fprintf(fp,"Sorted Array:\n");
    for (int i =1; i <= MAX_LINES; i++) {
       fprintf(fp,"sentence %d:%s \n ", i, output[i]);
     }
  fclose(fp);
   }

содержимое input.txt файл

cat
O, Draconian devil! Oh, lame saint!
tac
Tom Marvolo Riddle
Software engineering
Leonardo da Vinci! The Mona Lisa!
Computer science
CUD
Act
cuddle
Hey there!
Old Immortal dovers
I am Lord Voldemort
duck

файл сортировки


void swap(char sentencesToSwap[][MAX_CHAR], int i, int j){
    for(int x = 0;x < MAX_CHAR; x++ ) {
        char temp = sentencesToSwap[i][x];
        sentencesToSwap[i][x] = sentencesToSwap[j][x];
        sentencesToSwap[j][x] = temp;
    }
}
void quicksort(char sentencesToSort[][MAX_CHAR], int first, int last){
    if(first < last){
        char pivotindex = partition(sentencesToSort, first, last);
        quicksort(sentencesToSort, first, pivotindex-1);
        quicksort(sentencesToSort, pivotindex+1, last);
    }
}
int partition(char sentencesToSort[][MAX_CHAR], int first, int last){
    swap(sentencesToSort, first, (first + last) / 2);
    char *pivot;
    pivot = sentencesToSort[first];      // remember pivot

    int index1 = first + 1; // index of first unknown value
    int index2 = last;    // index of last unknown value
    while (index1 <= index2) { // while some values still unknown
        if (strcasecmp(sentencesToSort[index1],pivot) <= 0)
            index1++;
        else if (strcasecmp(sentencesToSort[index2],pivot) > 0)
            index2--;
        else {
            swap(sentencesToSort, index1, index2);
            index1++;
            index2--;
        }
    }
    swap(sentencesToSort, first, index2); // put the pivot value between the two
    // sublists and return its index
    return index2;
}

Основной файл ниже

   char sentences[MAX_LINES][MAX_CHAR];
    readSentences(sentences);
    isAnAnagram(sentences);
    quicksort(sentences, 0, MAX_LINES );
    writeAnswer(sentences);
...