Не могу найти проблему после отладки кода - PullRequest
0 голосов
/ 26 ноября 2018

При отладке следующего кода, отладчик указывает на строку (строку, которую я закомментировал в последней функции «printResults» ниже), но не смог выяснить, в чем проблема и почему отладчик указывает на этолиния.

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>

#define BUFFER_SIZE 256


void swap(char** a, char** b) {
    char* temp = *a;
    *a = *b;
    *b = temp;
}

char* getLongestString(char** strings, int size) {
    char* max = strings[0];
    for (int i = 1; i < size; i++) {
        if (strlen(max) < strlen(strings[i])) {
            max = strings[i];
        }
    }
    return max;
}

void sortStrings(char** strings, int size) {
    bool changed = true;
    while (changed) {
      changed = false;
        for (int i = 0; i < size - 1; i++) {
          if (strcmp(strings[i], strings[i + 1]) >= 0) {
            swap(&strings[i], &strings[i + 1]);
            changed = true;
          }
        }
    }
}

int readSize() {
  int size = 0;
  printf("Enter number of strings:\n");
  scanf("%d", &size);
  return size;
}

void printResults(char** words, int size) {
    char* longest = getLongestString(words, size);
    printf("The longest word is: %s\n", longest);
    sortStrings(words, size);
    //printf("The maximal word lexicographically is: %s\n", words[size]);
    printf("The minimal word lexicographically is: %s\n", words[0]);
}

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Подумайте, что при замедлении массива при объявлении массива индекс 0 не считается первым элементом, но когда вы, например, используете адрес этих данных, первый индекс которого учитывается, давайте объявим массив

int x[5];

тем самым вы сообщаете компилятору выделить 5 доступных целочисленных адресов памяти. Таким образом, вы получите выделенную область, и ваш размер будет равен 5. Предположим, что компилятор даст вам 5 адресов, начиная с 0x20000580--0x20000584, записав

x[0] = data0;// you are writing data to  the address of 0x20000580-> data0             
x[1]= data1;// 0x20000581-> data1 
...
x[4]= data4 //0x20000584->data4

так что в вашем случае, когда вы пытаетесь написать x [размер], который равен x [5], вы пытаетесь получить доступ к нераспределенной области, и это вызывает серьезное прерывание сбоя, и вы столкнетесь с неуправляемым руководствомисключение.

0 голосов
/ 26 ноября 2018

Взгляните на эту строку

printf("The maximal word lexicographically is: %s\n", words[size]);
                                                      ^^^^^^^^^^^

последний допустимый элемент в массиве имеет индекс size-1, но вы индексируете массив, используя size.Другими словами - доступ вне границ.

Так что измените на

printf("The maximal word lexicographically is: %s\n", words[size - 1]);
                                                      ^^^^^^^^^^^^^^^

КСТАТИ:

Эта строка

if (strcmp(strings[i], strings[i + 1]) >= 0) {

кажется открытойна бесконечный цикл в случае, если две строки идентичны.Вы, вероятно, не хотите >=, а только >

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...