Программа возвращает -1073741819 при использовании strcat в C - PullRequest
0 голосов
/ 07 января 2019

Это целая функция. По сути, я пытался стереть некоторые слова из предложения. Я испытываю, когда программа достигает первой строки strcat.

Я действительно понятия не имею, в чем здесь проблема? Я неправильно использовал указатели?

РЕДАКТИРОВАТЬ: я пытаюсь это:

   void reset_array(char* word,int n)
{
    for (int i = 0; i < n; i++)
        word[i] = 0;
}

void change_sentence(char* new_sentence, char* sentence, int n)
{
    while (new_sentence!=EMPTY)
    {
        *sentence = *new_sentence;
        sentence++; new_sentence++;
    }
}

void delete_words(char * words[], int n, char * sentence) 
{
    char* sen_copy = sentence; bool first = true;
    char* new_sentence = (char*)malloc(sizeof(char)*strlen(sentence)+1);
    reset_array(new_sentence, strlen(sentence) + 1);
    char* new_sentence_copy = new_sentence;
    while (*sen_copy)
    {
        char current_word[MAX_LEN];
        reset_array(current_word,MAX_LEN);
        int i = 0;
        while (*sen_copy && *sen_copy != WORD_SEPERATOR)
        {
            current_word[i] = *sen_copy;
            i++;
            sen_copy++;
        }
        if (!is_string_in_array(words, n, current_word))
        {
            if (!first)
            {
                *new_sentence_copy = WORD_SEPERATOR;
                new_sentence_copy++;
            }
            int count = 0;
            while (count < i)
            {
                *new_sentence_copy = current_word[count];
                count++;
                new_sentence_copy++;
            }
            first = false;
        }
        if (*sen_copy == WORD_SEPERATOR)
            sen_copy++;
    }
    printf("Hi");
    change_sentence(new_sentence, sentence, strlen(sentence) + 1);
    free(new_sentence);
}

Я получаю тот же код ошибки.

Что вызывает ошибку сейчас? Разрешено ли мне менять предложение? Я думал, что вы могли бы сделать это, если это массив.

1 Ответ

0 голосов
/ 07 января 2019

из стандарта C, & sect; 6.7.9: Инициализация :

Объявление char *p = "abc"; определяет p с типом «указатель на символ» и инициализирует его, чтобы указать на объект с типом «массив символов» длиной 4, элементы которого инициализируются литералом символьной строки. Если предпринята попытка использовать p для изменения содержимого массива, поведение не определено .

Акцент мой.

Вы не можете присвоить new_empty_string после того, как оно объявлено. Ни оператор присваивания, =, ни присвоение ему параметра назначения в strcat не будут работать. Ваши варианты:

  1. Объявите new_empty_string как массив типа char [], где длина достаточна для хранения ожидаемых значений
  2. Выделите достаточное количество памяти для new_empty_string с помощью malloc или связанных функций и free памяти, когда вы закончите с его использованием.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...