声明向量字符串数组C ++时出现分段错误

时间:2015-06-01 14:35:58

标签: c++ arrays string vector

#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
//#include<set>
#include<list>
#include<cmath>
//#include<algorithm>
#include<fstream>
#include<vector>

#define max 10000.0
using namespace std;

int main()
{
    int n;//number of rooms
    cin>>n;
    vector<string> room_name(n,"");

    for(int i=0;i<n;i++)
        {
            string tmp;
            cin >> tmp;
            room_name.push_back(tmp);
        }
}

错误分段错误:11仍然发生。

无法找到错误点。知道为什么会这样吗?

3 个答案:

答案 0 :(得分:2)

声明一个向量是不够的:与数组不同,它可以增长,因此默认情况下它以固定大小为零开始。

如果您事先知道矢量的大小,可以请求特定大小的矢量(之后也可以增长)

vector<string> room_name(n, ""); // You can supply a different default, or no default here

这会生成100个空字符串的向量,让您在后续循环中访问元素0..n-1。

或者,您可以使用push_back让您的矢量一次增长一个元素,如下所示:

for(int i=0;i<n;i++)
    {
    string tmp;
    cin >> tmp;
    room_name.push_back(tmp);
    }

答案 1 :(得分:1)

除非矢量已经调整大小,否则您需要使用push_back附加到矢量的末尾。

std::vector<int> foo;
for (int i = 0; i < 10; ++i)
{
    foo.push_back(i);
}

否则,您需要确保矢量已经调整大小

std::vector<int> foo(10);

或者

std::vector<int> foo;
foo.resize(10);

然后您可以像使用

一样使用索引
for (int i = 0; i < 10; ++i)
{
    foo[i] = i;
}

如果在调整数组大小之前尝试写入每个索引,则表示内存超出范围。

答案 2 :(得分:0)

你确实要在向量中手动输入1000个字符串吗?:)

使用大写字母定义常态名称也是个好主意。而不是

td

最好写

#define max 10000.0

目前尚不清楚为什么将max定义为浮点数而不是整数。

考虑到你的程序中没有声明变量n。所以该程序无法编译。也许你的意思是max而不是n。

由于向量被定义为空向量

#define MAX 10000.0

即它没有元素,那么你可能不会使用下标运算符在向量中输入值。

您可以使用方法push_back,而不是以下方式

vector<string> room_name;

而不是循环,您可以使用标题vector<string> room_name; room_name.reserve( n ); for ( int i = 0; i < n; i++ ) { string s; cin >> s; room_name.push_back( s ); } 中声明的标准算法std::copy_n

<algorithm>

如果要输入字符串

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

#define N   2

int main() 
{
    std::vector<std::string>room_name;
    room_name.reserve( N );

    std::copy_n( std::istream_iterator<std::string>( std::cin ), N,
                 std::back_inserter( room_name ) );

    for ( const std::string &s : room_name ) std::cout << s << std::endl;                

    return 0;
}

然后程序将从向量

输出它们
my_room
your_room