Даны две строки, найдите слова, которые являются общими для обеих строк.

Например: input: char *str1 = "все хорошо"; char *str2 = "это кто"; вывод: общие слова в двух заданных строках, возврат двумерного массива строк.

#define SIZE 31

char ** commonWords(char *str1, char *str2) {

    int i,j=0,count1,count2,k=0,a,b,m=0,n;
    char str3[100][100], str4[100][100];
    char **output;
    output = (char **)malloc(SIZE*sizeof(char*));
    if (str1 == NULL || str2 == NULL)
    {
        return NULL;
    }
    for (i = 0; str1[i] != '\0'; i++)
    {
        if (str1[i] != ' ')
        {
            str3[j][k++] = str1[i];
        }
        else
        {
            str3[j][k++] = '\0';
            j++;
            k = 0;
        }
    }
    str3[j][k++] = '\0';
    count1 = j > 0 ? j + 1 : j;
    j =  k = 0;
    for (i = 0; str2[i] != '\0'; i++)
    {
        if (str2[i] != ' ')
        {
            str4[j][k++] = str2[i];
        }
        else
        {
            str4[j][k++] = '\0';
            j++;
            k = 0;
        }
    }
    str4[j][k++] = '\0';
    count2 = j > 0 ? j + 1 : j;
    for (i = 0; i < count1; i++)
    {
        for (j = 0; j < count2; j++)
        {
            if (str3[i][k] == str4[j][k])
            {
                if (str3[i][k + 1] == str4[j][k + 1] && str3[i][k + 2] == str4[j][k + 2] == '\0')
                {
                    a = i;
                    b = k;
                    while (str3[a][b] != '\0')
                    {
                        output = (char **)malloc(SIZE*sizeof(char));
                        output[m][n] = str3[a][b];
                        n++;
                        b++;
                    }
                    output[m][n] = '\0';
                }
                else if (str3[i][k + 1] == str4[j][k + 1] && str3[i][k + 2] == str4[j][k + 2])
                {
                    a = i;
                    b = k;
                    while (str3[a][b] != '\0')
                    {
                        output = (char **)malloc(SIZE*sizeof(char));
                        output[m][n] = str3[a][b];
                        n++;
                        b++;
                    }
                    output[m][n] = '\0';
                    m++;
                }
            }
        }
    }
    return output;
    }

Я отлаживаю этот код в визуальных студиях, и тест не пройден. Он показывает это «сообщение: Код исключения: C0000005». Это означает ошибку, связанную с распределением памяти. Итак, где я ошибся?


person Srikanth    schedule 21.03.2016    source источник
comment
А награда за самый читаемый код достается.... нет, не вам, извините.   -  person ckruczek    schedule 21.03.2016
comment
Проверьте эту строку output = (char **)malloc(SIZE*sizeof(char));   -  person Sourav Ghosh    schedule 21.03.2016
comment
Почему вы постоянно перезаписываете output новыми распределениями? Вы потеряете ранее выделенную память.   -  person M Oehm    schedule 21.03.2016
comment
Если output является char **, то это массив, содержащий char * значений. Таким образом, количество байтов равно SIZE*sizeof(char *), а не SIZE*sizeof(char), как у вас. Вы выделяете только часть памяти, которую пытаетесь использовать.   -  person Tom Karzes    schedule 21.03.2016


Ответы (1)


У вас есть заявление

output = (char **)malloc(SIZE*sizeof(char));

в двух строках вашей программы.

Вы должны изменить этот оператор, чтобы выделить память для двойного указателя output типа char**, но вам также необходимо выделить память для каждого элемента output следующим образом:

int i;
output = (char **)malloc(SIZE*sizeof(char*));
for (i = 0; i < SIZE; i++)
    output[i] = (char *)malloc(x*sizeof(char));

где x - желаемый размер.

Также проверьте возврат указателя NULL, например

if (output[i] == NULL)
    ....
person Marievi    schedule 21.03.2016