C++ 访问冲突读取位置和读取字符串字符时出错
谁能解释为什么会抛出访问冲突读取位置erorr,以及为什么在[]中我得到“erorr读取字符串字符”?我有两个字符串,必须删除第一个字符串中包含其他字符串的所有单词。我做错了什么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[])
#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;
}