2016-08-22 8 views
0

Я пишу программу, которая разбивает любые два числа. Проблема заключается в том, когда я запускаю программу, я получаю ошибку, которая говорит:Получение «./a.out» завершено сигналом SIGSEGV (ошибка границы адреса)

«./a.out» останавливал сигнал SIGSEGV (ошибку краевого адреса)

И эта ошибка происходит на линиях :

a = std::stoi(temp_vec.front()); 
b = std::stoi(temp_vec.back()); 

и

c = std::stoi(temp_vec.front()); 
d = std::stoi(temp_vec.back()); 

Вот моя программа:

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

void split_number(std::vector<std::string> vect, int x); 

int main() 
{ 
    int x = 0, y = 0, a = 0, b = 0, c = 0, d = 0; 
    std::vector<std::string> temp_vec; 

    std::cout << "Enter x: "; 
    std::cin >> x; 
    std::cout << "Enter y: "; 
    std::cin >> y; 

    split_number(temp_vec, x); 
    a = std::stoi(temp_vec.front()); 
    b = std::stoi(temp_vec.back()); 

    split_number(temp_vec, y); 
    c = std::stoi(temp_vec.front()); 
    d = std::stoi(temp_vec.back()); 

    return 0; 
} 

void split_number(std::vector<std::string> vect, int x) 
{ 
    vect.clear(); 

    //1. convert x to string 
    std::string temp_str = std::to_string(x); 

    //2. calculate length 
    std::size_t len = temp_str.length(); 
    std::size_t delm = 0; 
    if(len % 2 == 0) { 
    delm = len/2; 
    } else { 
    delm = (len + 1)/2; 
    } 

    //3. populate vector 
    vect.push_back(temp_str.substr(0, delm)); 
    vect.push_back(temp_str.substr(delm + 1)); 
} 

Любая помощь будет оценена по достоинству.

ответ

3

Вы получаете ошибку сегментации, потому что ваш вектор пуст. Ваш вектор пуст, потому что вы передаете копию вашего начального вектора на split_number(). Копия передается, потому что подпись split_number() говорит, что для нее требуется копия. Измените его на:

void split_number(std::vector<std::string> & vect, int x) 

Амперсанд делает vect параметр ссылки параметр, и изменения будут отображаться в коде вызова.