Ошибка сегментации с strcat () в C - PullRequest
0 голосов
/ 01 ноября 2019
// Processes the array, starting from the second element
    int j, k;
    char *doubled;
    for (j = 1; j < 500; j++) {
        strcpy(doubled, output[j]);
        strcat(doubled, doubled);
        for (k = 0; k < j; k++) {
            if (strcmp(output[k], output[j]) == 0) {
                output[j] = doubled;
            }
            if (strcmp(output[k], doubled) == 0) {
                output[j] = '\0';
            }
        }
    }

Попытка обработать массив строк, где всякий раз, когда конкретная строка встречается дважды, во втором случае выдается дублирование строки (например, dog dog ---> dog dogdog), и если их больше 2вхождения строки, удалите строку (например, dog dog dog ---> dog dogdog).

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

Что мне нужно сделать, чтобы это исправить? Я рассмотрел несколько решений strcat (), создающих ошибки сегментации, но, похоже, ни одно из них не сработало.

1 Ответ

0 голосов
/ 01 ноября 2019

Редактировать: Согласно комментариям, если исходный массив cstrings не был выделен с достаточным объемом памяти на строку, то, вероятно, лучшее решение состоит в том, чтобы создать еще один пустой массив с двойной выделенной памятью на строку и скопировать старый массив вновый пустой следующий:

int count = 500;
int temp_size = 0;
char** new_array = malloc(count * sizeof(char*));
for(int i = 0; i < count; i++) {
    temp_size = strlen(output[i]);
    new_array[i] = malloc(((temp_size * 2) + 2) * sizeof(char)));
    strcpy(new_array[i], output[i]);
}

Динамически создать массив строк с помощью malloc

Можно избежать многих проблем, объявив переменные внутри цикла for, тогда их время жизни и область действия ограничены циклом for. В вашем случае, я думаю, что это работает (см. Комментарии и изменения):

int size = 0;
for (j = 1; j < count; j++) {
    size = strlen(output[j]);        //get the size of output[j]
    char doubled[(size * 2) + 1];    //make cstring twice size + space for '\0'
    strcpy(doubled, output[j]);      //put one copy in the temporary buffer
    strcat(doubled, output[j]);      //concatenate next copy like this
        for (k = 0; k < j; k++) {
            if (strcmp(output[k], output[j]) == 0) {
                strcpy(new_array[j], doubled);     //make changes to new_array
            }
            if (strcmp(new_array[k], doubled) == 0) {
                char deleted[1] = "\0";            //needed for free to work 
                strcpy(new_array[j], deleted);     //otherwise runtime error  
            }
        }
    }

Объявление переменных внутри циклов, хорошая практика или плохая практика?

Когда сделано сnew_array, его также необходимо удалить:

for (int i = 0; i < count, i++) {
    free(new_array[i]);
}
free(new_array);
new_array = NULL;
...