访问冲突读取位置和错误读取字符串的字符

时间:2017-12-15 13:35:11

标签: c++ pointers

谁能解释为什么抛出访问违规读取位置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;
}

2 个答案:

答案 0 :(得分:2)

这里至少有一个问题:

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

在该循环之后,ma的所有元素都指向超出范围的变量。一旦n循环的l之间的范围被保留,变量{}for就不再存在。

你对指针有很多误解,你应该读一些关于C语言的好书(你写的代码实际上比C语言更多C)。

肯定会有更多错误。

答案 1 :(得分:1)

这里有很多邪恶,我不知道从哪里开始。

  • 您在静态分配的数组
  • 上调用delete
  • p1p2np1np2都是未分配的,您正在写信给他们

请使用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"));

Live Example

如果在理解了上面的例子后你发现自己有兴趣进一步研究,那么这个例子可以很容易地进一步充实我从这里开始:https://stackoverflow.com/a/38595708/2642059