【问题标题】:Vector Subscript out of range error.The error occurs even if the vector has greater index than the index for which data is accessed向量下标超出范围错误。即使向量的索引大于访问数据的索引,也会发生错误
【发布时间】:2018-09-11 14:29:12
【问题描述】:

我正在使用 VC++ 2013。我正在尝试访问显示矢量下标超出范围的矢量索引。我的代码如下:

std::string str="1,2,3, 4 , 0.00000 , ";
 vector<string>veclist;
 veclist=(tokenize(str,","));
 //Now the veclist has a size of 6.But when i am trying to access it through;
 long num=stol(veclist.at(4));

代码崩溃并显示向量下标超出范围。我不知道代码为什么崩溃以及其中的错误是什么!!!

【问题讨论】:

  • 你有一个长向量向量veclist;。所以这个调用 long num=stol(veclist.at(4));没有意义。因为函数 stol 需要一个 std::string 类型的对象。也许有一个错字,你需要一个字符串向量。
  • Vlad,它实际上是一个字符串向量。我把它称为长向量是一个错误。但后来改了。
  • 然后在tokenize函数中查找原因。
  • 你怎么知道你有6个元素?帮我检查veclist 的大小。

标签: c++ visual-c++ vector range tokenize


【解决方案1】:

代码崩溃并显示矢量下标超出范围。我不知道 为什么代码会崩溃,这是什么错误!!!

消息告诉你一切。

由于您无权访问veclist.at(4),它会崩溃。只是veclist 中没有足够的元素或veclist 为空。

执行(tokenize(str,","));后通过veclist.size()检查veclist中的数字元素

编辑:

您可能有不同的问题然后报告。 stol 函数可能不喜欢您的 str 令牌。这可能会导致崩溃。

考虑这个测试程序。我写了tokenize_split,应该和你的一致。

#include <vector>
#include <string>
#include <string.h>
#include <sstream>
#include<iostream>

using namespace std;

std::vector<std::string> tokenize_split(const std::string &s, char delim) {
    std::stringstream ss(s);
    std::string item;
    std::vector<string> tokens;
    while (getline(ss, item, delim)) {
        tokens.push_back(item);
    }
    return tokens;
}

int main(void)
{
   std::string str1="1 2 3 4 5 6";
   std::string str2="1,2,3, 4 , 0.00000 , "; // Your string
   std::string str3="1,2,3,4,5,6";

   vector<string> veclist;
   long num; 

   veclist = tokenize_split(str3, ',');
   std::cout <<  "Size= " << veclist.size() << endl;
   std::cout <<  "Token= " << "<" << veclist.at(4) << ">"  << endl;
   num = std::stol(veclist.at(4));
   std::cout << "Number " << num  << endl << endl;

   veclist = tokenize_split(str2, ',');
   std::cout << "Size= " << veclist.size() << endl;
   std::cout <<  "Token= " << "<" << veclist.at(4) << ">"  << endl;
   num = std::stol(veclist.at(4));
   std::cout << "Number " << num  << endl << endl;

   veclist = tokenize_split(str1, ' ');
   std::cout <<  "Size= " << veclist.size() << endl;
   std::cout <<  "Token= " << "<" << veclist.at(4) << ">"  << endl;
   num = std::stol(veclist.at(4));
   std::cout << "Number " << num  << endl << endl;

   veclist = tokenize_split(str2, ' ');
   std::cout << "Size= " << veclist.size() << endl;
   std::cout <<  "Token= " << "<" << veclist.at(4) << ">"  << endl;
   num = std::stol(veclist.at(4));
   std::cout << "Number " << num  << endl;

   return 0;
}

测试:

Size= 6                                                                                                                                      
Token= <5>                                                                                                                                   
Number 5                                                                                                                                     

Size= 6                                                                                                                                      
Token= < 0.00000 >                                                                                                                           
Number 0

Size= 6                                                                                                                                        
Token= <5>                                                                                                                                     
Number 5                                                                                                                                       

Size= 5                                                                                                                                        
Token= <,>                                                                                                                                     
terminate called after throwing an instance of 'std::invalid_argument'                                                                         
  what():  stol                                                                                                                                
Aborted

程序崩溃,因为您的字符串str2 不包含可以通过stol 函数成功转换为long 的有效数字。令牌',' 将导致中止。

【讨论】:

  • 不,我在 veclist 中有足够的元素,这就是为什么我对这个错误感到困惑。
  • @KawinAnto 你能在执行(tokenize(str,","));之后帮我检查一下std::cout &lt;&lt; veclist.size()吗?
  • 是的@sg7 ....我在标记字符串后检查了它..它是6 ...即使我在访问它之前添加了一个检查行(如果veclist.size()==6) .
  • @KawinAnto:“不,我在 veclist 中有足够的元素” 这不可能。您的假设/观察已被证明是错误的。更详细地检查它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 2011-07-06
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多