字符串向量 push_back 在类中失败
Posted
技术标签:
【中文标题】字符串向量 push_back 在类中失败【英文标题】:string Vector push_back failing in class 【发布时间】:2013-10-14 12:39:13 【问题描述】:我有一个类,它的方法应该返回一个字符串向量。 getCommVector 方法必须将字符串数组的元素 push_back 到一个字符串向量中,然后该方法可以返回该字符串向量。当尝试将字符串元素添加到字符串向量时,我得到:
libc++abi.dylib: terminate called throwing an exception
2Program ended with exit code: 0
我不明白为什么我不能 push_back 字符串到向量。有任何想法吗? 提前致谢!
感兴趣的代码段(根据建议编辑):
class Command
public:
//Command (std::string, bool, bool);
void setOperators(std::string,bool, bool);
void analyseCommand();
Command();
std::vector<std::string> getCommVector ();
private:
int numOperators; //number of total commands
int opCount; //current command number
std::string input_string;
bool field_command, byte_command;
std::string commVector[3];
std::vector<std::string> finalCommVector;
void byte_analysis();
void field_analysis();
void decode_command();
void syntax_error();
void decode_error();
;
Command::Command() : numOperators(0), opCount(0), field_command(false),byte_command(false)
std::vector<std::string> Command::getCommVector ()
std::string s ="test";
finalCommVector.push_back("s");
return finalCommVector;
添加 SSCE:
class Command
public:
//Command (std::string, bool, bool);
void setOperators(std::string,bool, bool);
void analyseCommand();
Command();
std::vector<std::string> getCommVector ();
private:
int numOperators; //number of total commands
int opCount; //current command number
std::string input_string;
bool field_command, byte_command;
std::string commVector[3];
std::vector<std::string> finalCommVector;
void byte_analysis();
void field_analysis();
void decode_command();
void syntax_error();
void decode_error();
;
Command::Command() : numOperators(0), opCount(0), field_command(false),byte_command(false)
void Command::syntax_error()
std::cout<<"Incorrect Syntax Error: Usage: linuxcut -b num -f num \n";
exit(EXIT_FAILURE);
void Command::decode_error()
std::cout<<"Decode Error: Usage: linuxcut -b num -f num \n";
exit(EXIT_FAILURE);
void Command::analyseCommand()
if (byte_command)
//start byte command analysys
byte_analysis();
else if (field_command)
//start field command analysys
field_analysis();
void Command::setOperators(std::string input_argument, bool is_field, bool is_byte)
input_string = input_argument;
field_command = is_field;
byte_command = is_byte;
std::vector<std::string> Command::getCommVector ()
std::string s = "ssd";
finalCommVector.push_back(s);
/*
for (int i = 0; i<sizeof(commVector); i++)
if (commVector[i] != "")
//debug
std::cout<<"asdas";
*/
return finalCommVector;
void Command::byte_analysis()
int next_state = 0;
int dashCount = 0;
int commVectIndex = 0;
//iterate through string and check if the argument is valid
for (int i= 0; i<input_string.length(); i++)
switch (next_state)
case 0: //start
//if character is a number:
if (isdigit(input_string.at(i)))
//first elemnt of command commVector is number
commVector[commVectIndex]+=input_string.at(i);
//DEBUG
std::cout<<commVector[commVectIndex];
next_state = 1;
//if character is a dash:
else if (input_string[i] == '-')
//increment dashCount
dashCount++;
//if next character in input_string is a number continue
if (isdigit(input_string[i+1]))
commVector[commVectIndex]+=input_string.at(i);
commVectIndex++;
next_state = 1;
else //else error
syntax_error();
//if it's niether: error!
else
syntax_error();
break;
case 1:
//if next character is a number:
if (isdigit(input_string[i]))
commVector[commVectIndex]+=input_string.at(i);
next_state = 1;
//if next character is dash
else if (input_string[i] == '-'&& dashCount <= 3)
dashCount++;
//increment commandVectIndex
commVectIndex++;
next_state = 2;
commVector[commVectIndex]+=input_string.at(i);
//increment commandVectIndex to accomodate next operation
commVectIndex++;
//if it's niether: error!
else
syntax_error();
break;
case 2://previous character was dash
//if next character is number
if (isdigit(input_string[i]))
commVector[commVectIndex]+=input_string.at(i);
next_state = 1;
//if it's niether: error!
else
syntax_error();
break;
default:
syntax_error();
break;
void Command::field_analysis()
/*****************FUNCTIONS DEFINITIONS***************/
void print_usage()
std::cout<<"Incorrect Syntax Error: Usage: linuxcut -b num -f num \n";
/*****************END OF FUNCTIONS DEFINITIONS***************/
/***************** MAIN ***************/
int main(int argc, char *argv[])
int opt= 0;
std::string byte = "-1-2,2",field = "";
std::string sub_arg_delimiter = ","; //delimiter for comma serparated arguments
static bool complement = false;
int diffOpt = 0; //stores the difference between optind and argc to read filenames in command
std::string fileName;
//Specifying the expected options
//The two options l and b expect numbers as argument
static struct option long_options[] =
"byte", required_argument, 0, 'b' ,
"field", required_argument, 0, 'f' ,
"complement", no_argument, 0, 0 ,
0, 0, 0, 0
;
Command testCommand;
testCommand.setOperators("-2-", false, true);
std::vector<std::string> trial = testCommand.getCommVector();
std::cout<<"filename:"<<fileName<<std::endl;
std::cout<<"Selected flags:\n"<< "b: "<< byte<<"\nf: "<<field<<"\ncomplement: "<<complement<<std::endl;
return 0;
【问题讨论】:
sizeof(commVector)
产生3*sizeof(std::string)
,以字节为单位的大小,而不是元素的数量。
这应该是 finalCommVector.push_back(s);
没有撇号吗?
谢谢,我现在就解决这个问题。我试着把那个语句拿走,只是试着做一个简单的 push_back 到一个字符串的 finalComm 向量,它失败了(没有循环或任何东西),它仍然失败:(
【参考方案1】:
您的迭代方式超出了数组大小。 sizeof(commVector)
返回数组的大小以字节为单位。
如果你有 C++11 可用,你可以这样做:
for (const auto &s : commVector)
if (s != "")
// as before
或者至少是这个(如果你只有部分 C++11 支持):
for (auto it = std::begin(commVector); it != std::end(commVector); ++it)
std::string s = *it;
// the rest as before
没有 C++11,你至少可以这样做:
for (int i = 0; i < sizeof(commVector) / sizeof(commVector[0]); ++i)
// the rest as before
或者提供你自己的函数来获取正确的数组大小:
template <class T, size_t N>
size_t arraySize(const T (&)[N]) return N;
// Use:
for (size_t i = 0; i < arraySize(commVector); ++i)
// the rest as before
【讨论】:
非常感谢,不幸的是,这并不能解决我的 push_back 问题。我现在只是出于测试目的而取消了循环,但它仍然失败我将方法简化为: std::string s = "ssd"; finalCommVector.push_back(s); @realn00b 那么问题可能出在其他地方。可以发SSCCE吗? 整个代码很长,但是在一个源文件中,我可以在哪里发布? @realn00b 不要。如果您希望我们花时间帮助您,请准备好自己投资一些来删除不相关的部分。也许这甚至可以帮助您自己找到问题。这就是为什么您应该在首先准备 SSCCE。 @realn00b 哎呀,那是相当多的代码。你不能进一步减少它(例如硬编码所需的选项而不是解析它们等)吗?【参考方案2】:i<sizeof(commVector);
应该是
i<countof(commVector);
如果为您的编译器定义了 countof/_countof。如果没有,你可以自己做,通常定义为:
#define countof(a) (sizeof(a)/sizeof(a[0]))
我不会讨论如何在 C++ 中使用宏 :)
当然,如果你的数组有固定数量的元素,你也可以使用常量,但我想这只是一个例子。
sizeof
返回对象(在本例中为字符串数组)本身的大小,而不是向量内元素的计数。
因此,它等于数组元素的数量乘以单个字符串实例的大小,因此您尝试使用operator[]
访问不存在的项目。
这也坏了:
finalCommVector.push_back("s");
你的意思可能是:
finalCommVector.push_back(s);
【讨论】:
哦,是的,我混淆了 finalCommVector。谢谢,我会修复答案【参考方案3】:如果您只需要std::string commVector
的数组作为std::vector<String>
,您可以使用std::vecor::assign
:finalCommVector.assign(commVector, commVector+3)
“3”是数组的长度。
【讨论】:
assign
替换内容,因此行为与push_back
不同。 (但不确定 OP 想要哪一个。)
我尝试了assign,但是当我进入assign函数时它陷入了无限循环?
程序的其他地方有些东西已经烂了。请提供SSCE 以证明您的问题。
在哪里可以上传?抱歉,我第一次必须上传 SSCE
为option
添加合适的定义后,您的程序可以完美运行。以上是关于字符串向量 push_back 在类中失败的主要内容,如果未能解决你的问题,请参考以下文章