2011-11-11 25 views
6

cố gắng khởi tạo chuỗi từ vectơ. Tôi có nghĩa vụ để có được "hey" là đầu ra. nhưng tôi có "lỗi phân đoạn". tôi đã làm gì sai?vector <char> để lỗi phân đoạn chuỗi

//write a program that initializes a string from a vector<char> 
#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 
int main() 
{ 
    vector<char> cvec; 
    cvec[0]='h'; 
    cvec[1]='e'; 
    cvec[2]='y'; 
    string s(cvec.begin(),cvec.end()); 
    cout<<s<<endl; 
    return 0; 
} 
+1

Để thêm vào câu trả lời Mysticial của - 'cvec [0]' (và các truy cập khác) không gọi kiểm tra giới hạn, và vectơ của bạn không có các phần tử, do đó bạn đang truy cập vào một số phần bộ nhớ chưa được phân bổ cho bạn. – birryree

Trả lời

21

Lớp vectơ bắt đầu với kích thước bằng 0 (theo mặc định). Vì vậy, làm điều đó sẽ gây ra hành vi không xác định. (Trong trường hợp của bạn, một lỗi segmentation)

Bạn nên sử dụng push_back() thay vì:

vector<char> cvec; 
cvec.push_back('h'); 
cvec.push_back('e'); 
cvec.push_back('y'); 

này sẽ nối mỗi char vào vector.

+0

cảm ơn, đã làm việc. hoặc tôi phải khai báo nó với một bộ khởi tạo. "vector cvec (1);" – ihm

+2

Nếu bạn sử dụng 'push_back()', thì tốt thôi. Bạn không cần một bộ khởi tạo. – Mysticial

+1

Nếu bạn muốn sử dụng vectơ làm chuỗi kiểu C, bạn có thể thêm 'cvec.push_back (0);' để thêm ký tự null kết thúc. –

11

Bạn cần phải phân bổ không gian trong vector, như thế này:

vector<char> cvec(3); 

Hoặc đẩy các nhân vật trong từng người một:

vector<char> cvec; 
cvec.push_back('h'); 
cvec.push_back('e'); 
cvec.push_back('y');