C ++向量下标超出范围

时间:2014-10-08 21:13:17

标签: c++

在名为abc.txt的文件中,我输入了以下文字:

sample text
sample text
sample text
sample text
sample text

首先,我创建了用于保存文件读取的变量(命名文本)。然后程序读取文件abc.txt。我创建了名为:ArrSent的向量,用于保存文件abc.txt中的每一行。循环结束后程序关闭文件abc.txt。然后程序必须输出从矢量ArrSent到screnn的所有句子。我有这样的问题:在程序结束后,出现警告消息:向量下标超出范围。我不知道为什么......

#include<iostream>
#include<string>
#include<fstream>
#include<vector>

using namespace std;

void function()
{
    string text;//variable to save text from file
    ifstream myfile("abc.txt");//reading from file colled abc.txt




    vector<string> ArrSent;

    if (myfile.is_open())
    {
        //cout <<"myplik.good()= "<< myfile.good() << endl;

        while (myfile.good())
        {   
                getline(myfile, text);
                ArrSent.push_back(text);
        }


        myfile.close();
    }
    for (int i = 0; i <= ArrSent.size(); i++)
    {
        cout << ArrSent[i] << endl;
    }

}


int main()
{
    function();
    system("pause");
    return 0;
}

1 个答案:

答案 0 :(得分:4)

这里错了

for (int i = 0; i <= ArrSent.size(); i++)
{
    cout << ArrSent[i] << endl;
}

应该是

for (int i = 0; i < ArrSent.size(); i++)
{
    cout << ArrSent[i] << endl;
}

原因是在C / C ++中,矢量/数组是基于零的。也就是说,如果你有一个向量my_vector,大小为10,就像my_vector [0],my_vector [1],... my_vector [9]。没有my_vector [10]。

迭代它的更好方法可能是(C ++ 11)

for (const auto & v : ArrSent)
{
    cout << v << endl;
}

for (vector<string>::const_iterator i = ArrSent.begin(); i != ArrSent.end(); ++i)
    cout << *i << endl;

正如WhozCraig所指出的那样,阅读的while循环也是错误的,更好的版本可能是

  while (getline(myfile, text))
  {   
        ArrSent.push_back(text);
  }

关于function

的一句话

值得注意:您的函数名称为function。虽然这可能是描述性的,但您应该知道标准库头可以自由地包含其他标准库头(并且经常这样做)。标准库中的一个这样的标题是<functional>,幸运的是,std::function声明了它。

你为什么要关心?因为using namespace std;std中的所有内容都打开,没有名称空间限定符要求,包括可能std::function(无论您是否包含<functional>)。

这意味着虽然这仍然会编译:

void function()
{
     // .. stuff
}

这可能不是:

int main()
{
    function(); // HERE
    //... other stuff
}

这不知道您是否正在调用您的函数或尝试实例化std::function<>类型的单个临时值(无论如何都不能,因为没有描述模板参数)。结果可能是不明确的

您可以在::function();中使用main()来解决此问题,但如果您养成了不在通过{{1}的整个std库中啜饮的习惯会更好和/或不使用标准库中常见类型/ ID的名称。