https://stackoverflow.com/a/38595708/2642059

ожет объяснить, почему выбрасывается место нарушения прав доступа erorr и почему в [] я получаю «erorr чтение символов строки»? У меня есть две строки, и я должен удалить все слова из первой строки, содержащей другую строку. Что я делаю не так?

#include "stdafx.h"
#include<iostream>
#include<cstring>
using namespace std;
char s1[100] = {};
char s2[100] = {};
void Words(char s1[], char s2[]) {
  int k = 0;
  char*p1 = nullptr;
  char*np1 = nullptr;
  char*p2 = nullptr;
  char*np2 = nullptr;
  char *m[20];
  char *a[20];
  char s3[100] = {};
  for (int i = 0; i < 20; i++) {
    char n[50] = {};
    char l[50] = {};
    m[i] = n;
    a[i] = l;

  }
  char delimeter[] = " ,.!?;:";
  p2 = strtok_s(s2, delimeter, &np2);
  while (p2 != nullptr) {
    strcpy(a[k], p2);
    k++;
    p2 = strtok_s(nullptr, delimeter, &np2);
  }
  k = 0;
  p1 = strtok_s(s1, delimeter, &np1);
  while (p1 != nullptr) {
    strcpy(m[k], p1);
    k++;
    p1 = strtok_s(nullptr, delimeter, &np1);
  }

  for (int i = 0; i < 20; i++) {
    for (int j = 0; j < 20; j++) {
      if (strcmp(m[i], a[j]) != 0 && m[i] != 0 && a[j] != 0) {
        strcat(s3, m[i]);
      }
    }
  }
  puts(s3);
  for (int i = 0; i < 20; i++) {
    delete m[i];
    delete a[i];
  }
}

Основная функция:

int main()
{
  gets_s(s1);
  gets_s(s2);
  Words(s1, s2);
  return 0;
}
 Baum mit Augen15 дек. 2017 г., 14:42
Это пустая трата времени и, вероятно, приносит больше вреда, чем пользы. Ваш учитель должен чувствовать себя плохо, и вы должны дополнить этот курс хорошей книгой по C ++.
 user004215 дек. 2017 г., 14:37
Почему ты просто не используешьstd::string? В конце концов, это ужасный код на C ++, больше похожий на c.
 user004215 дек. 2017 г., 15:03
@ ЮраБезлюдний Направь своего учителяВот Пожалуйста.
 Jabberwocky15 дек. 2017 г., 14:54
Хорошие имена переменных это не для компилятора, и не для нас, это длявы так что вы можете легче понять свой собственный код во время отладки. Кстати, Visual Studio имеет мирового класса и очень простой в использовании отладчик. Узнайте, как его использовать.
 Jabberwocky15 дек. 2017 г., 14:48
Ваш выбор имен переменных из одной буквы неразумен и делает ваш (уже странный) код еще сложнее для понимания.

Ответы на вопрос(2)

Ты звонишьdelete на статически размещенном массивеp1, p2, np1, а такжеnp2 все нераспределены, и вы пишете им

Пожалуйста, используйтеstring:

const regex re{ "([^ ,.!?;:]+)" };
vector<string> s1Tokens{ sregex_token_iterator(cbegin(s1), cend(s1), re, 1), sregex_token_iterator() };
vector<string> s2Tokens{ sregex_token_iterator(cbegin(s2), cend(s2), re, 1), sregex_token_iterator() };

sort(begin(s1Tokens), end(s1Tokens));
sort(begin(s2Tokens), end(s2Tokens));

set_difference(cbegin(s1Tokens), cend(s1Tokens), cbegin(s2Tokens), cend(s2Tokens), ostream_iterator<string>(cout, "\n"));

Живой пример

Этот пример может быть легко расширен в дальнейшем, если после понимания приведенного выше примера вы захотите продолжить изучение, я начну здесь:https://stackoverflow.com/a/38595708/2642059

Здесь есть как минимум одна проблема:

  for (int i = 0; i < 20; i++) {
    char n[50] = {};
    char l[50] = {};
    m[i] = n;
    a[i] = l;
  }

После этого цикла все элементыm а такжеa указывают на переменные, которые вышли из области видимости. Переменныеn а такжеl прекратить существование, как только область между{} изfor петля была оставлена.

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

Есть конечно больше ошибок.

Ваш ответ на вопрос