访问违规读取位置和错误读取字符串的错误

Access violation reading location and error reading character of string

本文关键字:错误 读取 字符串 位置 访问      更新时间:2023-10-16

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

这里至少有一个问题:

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

循环之后,ma的所有元素都指向已超出范围的变量。变量nl一旦保留了for环的{}之间的范围。

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

当然有更多错误。

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

  • 您在静态分配的数组上调用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"));

实时示例

如果您发现自己有兴趣进一步学习我,我可以从这里开始学习:https://stackoverflow.com/a/38595708/2642059