Ошибка сегментации СИ

83
21 апреля 2022, 19:30

В Visual Studio всё работает прекрасно, а при компиляции в c99 иногда появляется ошибка сегментации

Требуется исключить из строки каждое K-ое слово и повторяем каждое M-ое слово.

Ошибка появляется, например, при:

Enter the string 1 2 3 1 2 3 Enter K, M 2 2 Ошибка сегментирования

Visual Studio:

Enter the string 1 2 3 1 2 3 Enter K, M 2 2 "1 3 2"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* get_str() {
    char buf[160] = { 0 };
    char* res = NULL;
    int len = 0, n = 0;
    do {
        n = scanf("%159[^\n]", buf);
        if (n < 0) {
            if (!res) {
                return NULL;
            }
        }
        else if (n > 0) {
            int chunk_len = strlen(buf);
            int str_len = len + chunk_len;
            res = realloc(res, str_len + 1);
            memcpy(res + len, buf, chunk_len);
            len = str_len;
        }
        else {
            scanf("%*c");
        }
    } while (n > 0);
    if (len > 0) {
        res[len] = '\0';
    }
    else {
        res = calloc(1, sizeof(char));
    }
    return res;
}
int main() {
    printf("Enter the string\n");       //заполняем
    char* str = NULL;
    str = get_str();                    //точно работает правильно
    printf("Enter K, M\n");
    int K, M;
    scanf("%d", &K);
    scanf("%d", &M);
    char** astr = NULL;                 //массив слов
    astr = calloc(strlen(str) + 1, sizeof(char));
    int len = 0;
    char* bufs = calloc((strlen(str) + 1), sizeof(char));  //закидываем каждое слово в отдельную ячейку
    for (int i = 0, j = 0; i <= strlen(str); i++) {
        for (j = strlen(str); j > 0; j--) bufs[j] = 0;
        while ((str[i] != ' ') && (str[i] != '\0')) {
            bufs[j] = str[i];
            j++;
            i++;
        }
        astr[len] = calloc(strlen(bufs) + 1, sizeof(char));
        strcat(astr[len], bufs);
        strcat(astr[len], "\0");
        len++;
    }
    for (int i = 0, j = 1; i < len; i++, j++) {     //удаляем каждое K
        if (j == K) {
            astr[i] = NULL;
            j = 0;
        }
    }
    int m = 1;
    for (int i = len - 1, j = len - 1; i >= 0; i--, j--) {  //удаляем каждое M
        while ((j != 0) && (astr[i] != NULL)) {
            j--;
            if ((astr[j] != NULL) && (strcmp(astr[i], astr[j]) == 0)) {
                m++;
            }
        }
        if (m % M == 0) astr[i] = NULL;
        m = 1;
        j = i;
    }
    printf("\"");
    for (int i = 0, j = len - 1; i < len; i++) {
        if (astr[i] != NULL) {
            printf("%s", astr[i]);
            while ((j >= 0) && (j > i)) {
                if (astr[j] != NULL) {
                    printf(" ");
                    j = len - 1;
                    break;
                }
                j--;
            }
        }
    }
    printf("\"\n");
    return 0;
}
Answer 1

char** astr = NULL; astr = calloc(strlen(str) + 1, sizeof(char)); - требуется указатель

char** astr = NULL; astr = calloc(strlen(str) + 1, sizeof(*char));

READ ALSO
Автовыведение типа

Автовыведение типа

я только начинаю свой путь в С++ поэтому задался таким вопросом как : Стоит ли вообще использовать auto в указании переменой или же лучше указывать...

99
Открытие всех директорий проекта в QtCreator

Открытие всех директорий проекта в QtCreator

Пишу на C++, в качестве IDE использую CLion, однако, он слишком громоздкий для домашнего использования на старом ноуте, и я в данный момент пробую...

105
Класс-обертка WinAPI Thread по аналогии работы std::thread

Класс-обертка WinAPI Thread по аналогии работы std::thread

Задача: заменить std::thread немного схожим по логике (собственно написанным) классом-оберткой WinAPI ThreadОсновная проблема связана с конструктором...

99
В выводе расшифрованной строки присутствуют некорректные символы

В выводе расшифрованной строки присутствуют некорректные символы

сегодня я решил попробовать написать шифрование строк и у меня даже получилосьОднако в выводе расшифрованной строки присутствуют лишние...

170