Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问冲突读取位置和读取字符串字符时出错_C++_Pointers - Fatal编程技术网

C++ 访问冲突读取位置和读取字符串字符时出错

C++ 访问冲突读取位置和读取字符串字符时出错,c++,pointers,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[])

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

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

  • 您正在对静态分配的数组调用
    delete
  • p1
    p2
    np1
    np2
    都是未分配的,您正在向它们写入
请使用
字符串

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"));
const regex re{([^,.!?;:]+)”;
向量s1Tokens{sregex_token_迭代器(cbegin(s1),cend(s1),re,1),sregex_token_迭代器();
向量s2Tokens{sregex_token_迭代器(cbegin(s2),cend(s2),re,1),sregex_token_迭代器();
排序(开始(s1Tokens),结束(s1Tokens));
排序(开始(s2Tokens),结束(s2Tokens));
设置差异(cbegin(s1Tokens)、cend(s1Tokens)、cbegin(s2Tokens)、cend(s2Tokens)、ostream_迭代器(cout,“\n”);


如果在理解了上述示例后,您发现自己有兴趣进一步学习,则可以很容易地进一步充实此示例。我从这里开始:

这里至少有一个问题:

  for (int i = 0; i < 20; i++) {
    char n[50] = {};
    char l[50] = {};
    m[i] = n;
    a[i] = l;
  }
for(int i=0;i<20;i++){
charn[50]={};
charl[50]={};
m[i]=n;
a[i]=l;
}
在该循环之后,
m
a
的所有元素都指向超出范围的变量。一旦
for
循环的
{}
之间的范围被保留,变量
n
l
就不再存在

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


当然还有更多的错误。

你到底为什么不直接使用
std::string
?这是可怕的C++代码毕竟,更像C.这是浪费时间,可能弊大于利。你的老师应该感到不好,你应该用一本好的C++书来补充这门课。你选择一个字母变量名是不明智的,并且使你(已经很奇怪)的代码更难理解。好的变量名不是编译器的,不是我们的,它是为你准备的,这样你可以在调试时更容易地理解你自己的代码。顺便说一句,VisualStudio有一个世界级的、非常易于使用的调试器。学习如何使用它。请指着你的老师。
  for (int i = 0; i < 20; i++) {
    char n[50] = {};
    char l[50] = {};
    m[i] = n;
    a[i] = l;
  }