C++ 字符数组中的空字符和分段错误-c++;
我正在填充一个字符数组,但当我尝试添加字符串结尾('\0')时,有时会出现分段错误。这是我的密码 板.hC++ 字符数组中的空字符和分段错误-c++;,c++,null,char,C++,Null,Char,我正在填充一个字符数组,但当我尝试添加字符串结尾('\0')时,有时会出现分段错误。这是我的密码 板.h #ifndef Plate_h #define Plate_h #include <string.h> #include <vector> #include "OCRChar.h" using namespace std; class Plate{ public: Plate(); void setChars(vecto
#ifndef Plate_h
#define Plate_h
#include <string.h>
#include <vector>
#include "OCRChar.h"
using namespace std;
class Plate{
public:
Plate();
void setChars(vector< vector<OCRChar> > chars);
vector<char*> getPlateNums();
private:
vector< vector<OCRChar> > chars;
vector<char*> plateNums;
void computePlateNumbers();
int calculatePlateListSize();
};
#endif
OCRChar.cpp
#include "OCRChar.h"
OCRChar::OCRChar(char character, float confidence){
this->character = character;
this->confidence = confidence;
}
char OCRChar::getCharacter(){
return character;
}
float OCRChar::getConfidence(){
return confidence;
}
main.cpp
#include "Plate.h"
#include "OCRChar.h"
#include <vector>
#include <iostream>
using namespace std;
int main(void){
vector< vector<OCRChar> > chars;
vector<OCRChar> char1;
vector<OCRChar> char2;
vector<OCRChar> char3;
vector<OCRChar> char4;
vector<OCRChar> char5;
vector<OCRChar> char6;
char1.push_back(OCRChar('A',90));
chars.push_back(char1);
char2.push_back(OCRChar('1',60));
char2.push_back(OCRChar('2',50));
char2.push_back(OCRChar('3',50));
char2.push_back(OCRChar('4',50));
chars.push_back(char2);
char3.push_back(OCRChar('B',60));
char3.push_back(OCRChar('C',50));
char3.push_back(OCRChar('D',50));
char3.push_back(OCRChar('E',50));
chars.push_back(char3);
char4.push_back(OCRChar('5',60));
char4.push_back(OCRChar('6',50));
char4.push_back(OCRChar('7',50));
char4.push_back(OCRChar('8',50));
chars.push_back(char4);
char5.push_back(OCRChar('F',60));
chars.push_back(char5);
char6.push_back(OCRChar('9',60));
char6.push_back(OCRChar('G',60));
chars.push_back(char6);
Plate p;
p.setChars(chars);
vector< char*> nums = p.getPlateNums();
for(int i=0;i<nums.size();i++){
cout<<"Plate num "<<i<<" :"<<nums[i]<<endl;
}
}
#包括“Plate.h”
#包括“OCRChar.h”
#包括
#包括
使用名称空间std;
内部主(空){
向量<向量>字符;
载体char1;
载体char2;
载体char3;
载体char4;
载体char5;
载体char6;
char1.向后推(OCRChar('A',90));
chars.推回(char1);
char2.向后推(OCRChar('1',60));
char2.向后推(OCRChar('2',50));
char2.向后推(OCRChar('3',50));
char2.向后推(OCRChar('4',50));
chars.向后推(char2);
char3.向后推(OCRChar('B',60));
char3.向后推(OCRChar('C',50));
char3.向后推(OCRChar('D',50));
char3.向后推(OCRChar('E',50));
chars.推回(char3);
char4.向后推(OCRChar('5',60));
char4.向后推(OCRChar('6',50));
char4.向后推(OCRChar('7',50));
char4.向后推(OCRChar('8',50));
chars.向后推_(char4);
char5.向后推(OCRChar('F',60));
chars.向后推(char5);
char6.向后推(OCRChar('9',60));
char6.向后推(OCRChar('G',60));
chars.向后推(char6);
板p;
p、 塞查斯(查斯);
向量nums=p.getPlateNums();
对于(inti=0;i检查platesSize%numCycles==0
。如果不是这样,您将不会在plates[j*oChars.size()*rep+k*rep+l]=new char[chars.size()+1];
中初始化板材的最后成员
比方说
platesSize == 100
oChars.size() == 9
rep == 1
numCycles = oChars.size()*rep == 9
iterations = platesSize/numCycles == 11
j = iterations-1 == 10
k = oChars.size()-1 == 8
l = rep-1 == 0;
j*oChars.size()*rep+k*rep+l == 10*9*1+8*1+0 == 98
因此,您将不会初始化plates[99]
我没有太多时间阅读代码
但是看看错误线,我可以给你一个建议
plates[i][chars.size()] = '\0';
每当数组元素访问产生问题时,首先必须确定索引是否在边界内
由于plates
是一个向量,您应该在这里使用std::vector.at(index)
。因此,如果执行任何越界访问,它将抛出。我怀疑越界访问是问题所在。我解决了将char*更改为string的问题:
#ifndef Plate_h
#define Plate_h
#include <string>
#include <vector>
#include "OCRChar.h"
using namespace std;
class Plate{
public:
Plate();
void setChars(vector< vector<OCRChar> > chars);
vector<string> getPlateNums();
private:
vector< vector<OCRChar> > chars;
vector<string> plateNums;
void computePlateNumbers();
int calculatePlateListSize();
};
#endif
#如果NDEF板
#定义板
#包括
#包括
#包括“OCRChar.h”
使用名称空间std;
班牌{
公众:
板();
无效设置字符(向量<向量>字符);
向量getPlateNums();
私人:
向量<向量>字符;
载体平台;
void computePlateNumber();
int calculatePlateListSize();
};
#恩迪夫
车牌号
#include "Plate.h"
Plate::Plate(){
}
void Plate::setChars(vector< vector<OCRChar> > chars){
this->chars = chars;
}
vector<char*> Plate::getPlateNums(){
if(plateNums.size()==0){
computePlateNumbers();
}
return plateNums;
}
void Plate::computePlateNumbers(){
if(chars.size()== 0)return;
int platesSize = calculatePlateListSize();
vector<char*> plates(platesSize);
int rep = 1;
for(int i = 0; i<chars.size();i++){
vector<OCRChar> oChars = chars[i];
int numCycles = oChars.size()*rep;
int iterations = platesSize/numCycles;
for(int j=0;j<iterations;j++){
for(int k= 0; k<oChars.size();k++){
for(int l=0;l<rep;l++){
if(!plates[j*oChars.size()*rep+k*rep+l]){
plates[j*oChars.size()*rep+k*rep+l] = new char[chars.size()+1];
}
plates[j*oChars.size()*rep+k*rep+l][i] = oChars[k].getCharacter();
}
}
}
rep = numCycles;
}
for(int i =0; i<platesSize; i++){
plates[i][chars.size()] = '\0';
}
plateNums = plates;
}
int Plate::calculatePlateListSize(){
int platesSize = 1;
for(int i = 0; i<chars.size();i++){
platesSize *= chars[i].size();
}
return platesSize;
}
#include "Plate.h"
Plate::Plate(){
}
void Plate::setChars(vector< vector<OCRChar> > chars){
this->chars = chars;
}
vector<string> Plate::getPlateNums(){
if(plateNums.size()==0){
computePlateNumbers();
}
return plateNums;
}
void Plate::computePlateNumbers(){
if(chars.size()== 0)return;
int platesSize = calculatePlateListSize();
vector<string> plates(platesSize);
int rep = 1;
for(int i = 0; i<chars.size();i++){
vector<OCRChar> oChars = chars[i];
int numCycles = oChars.size()*rep;
int iterations = platesSize/numCycles;
for(int j=0;j<iterations;j++){
for(int k= 0; k<oChars.size();k++){
for(int l=0;l<rep;l++){
plates[j*oChars.size()*rep+k*rep+l] += oChars[k].getCharacter();
}
}
}
rep = numCycles;
}
plateNums = plates;
}
int Plate::calculatePlateListSize(){
int platesSize = 1;
for(int i = 0; i<chars.size();i++){
platesSize *= chars[i].size();
}
return platesSize;
}
#包括“Plate.h”
板::板(){
}
空心板::设置字符(向量<向量>字符){
这->字符=字符;
}
向量板::getPlateNums(){
if(plateNums.size()=0){
computePlateNumber();
}
返回平台;
}
空心板::ComputePlateNumber(){
if(chars.size()==0)返回;
int platesSize=calculatePlateListSize();
矢量板(平板化);
int rep=1;
对于(int i=0;我请阅读指南,并在提供样本时注意“最小值”。好的,我将创建我的测试并与您分享。另外,为什么不使用vector
而不是vector
?我在vector中思考,这将是我的下一个方法,初始化不是问题。问题在图版[i][chars.size()]='\0';它只是在Debian Jessie上失败了。失败是因为在plates[j*oChars.size()*rep+k*rep+l]=new char[chars.size()+1];
中没有为j
、k
和l
分配内存*rep+k*rep+l
,因此plates[i]
未初始化,因此无法访问plates[i][chars.size()]
。这不是真的。如果我用空字符打印所有数组,它会在正确的字符后打印垃圾。我将char*改为string,这很好用。正如我提到的,它在Mac OS X和Fedora中非常好用,但在Debian/Raspian Jessie中,我有一些问题。
#ifndef Plate_h
#define Plate_h
#include <string>
#include <vector>
#include "OCRChar.h"
using namespace std;
class Plate{
public:
Plate();
void setChars(vector< vector<OCRChar> > chars);
vector<string> getPlateNums();
private:
vector< vector<OCRChar> > chars;
vector<string> plateNums;
void computePlateNumbers();
int calculatePlateListSize();
};
#endif
#include "Plate.h"
Plate::Plate(){
}
void Plate::setChars(vector< vector<OCRChar> > chars){
this->chars = chars;
}
vector<string> Plate::getPlateNums(){
if(plateNums.size()==0){
computePlateNumbers();
}
return plateNums;
}
void Plate::computePlateNumbers(){
if(chars.size()== 0)return;
int platesSize = calculatePlateListSize();
vector<string> plates(platesSize);
int rep = 1;
for(int i = 0; i<chars.size();i++){
vector<OCRChar> oChars = chars[i];
int numCycles = oChars.size()*rep;
int iterations = platesSize/numCycles;
for(int j=0;j<iterations;j++){
for(int k= 0; k<oChars.size();k++){
for(int l=0;l<rep;l++){
plates[j*oChars.size()*rep+k*rep+l] += oChars[k].getCharacter();
}
}
}
rep = numCycles;
}
plateNums = plates;
}
int Plate::calculatePlateListSize(){
int platesSize = 1;
for(int i = 0; i<chars.size();i++){
platesSize *= chars[i].size();
}
return platesSize;
}