2013-11-28 4 views
1

Было бы самым простым способом извлечь часть vector<char> (при условии, что я знал индексы), чтобы в итоге получилось const char*? Мне нужно сделать это, чтобы передать const char * in в atoi() и atol().Извлечь часть std :: vector <char> в const char *?

EDIT:

long pp; 
    int qq; 
    memcpy(&pp, &My_Vector[25], 8); 
    memcpy(&qq, &My_Vector[19], 4); 

    q= qq; 
    p= static_cast<double>(pp)/1E8; 

Однако, когда функция заканчивает:

Run-Time Check Failure # 2 - Stack вокруг переменной 'pp.51040' был поврежден.

+1

Что-то вроде '& vec [i]' возможно. Или 'vec.data()' Просто гадать здесь. – keyser

+1

atoi() требует pojinter для строки с нулевым завершающим символом, а не указателя на один символ! – ravenspoint

+0

Строка "0V" 20 "не представляет действительного числа. – Pat

ответ

3

Std :: vector гарантирует сохранение всех его элементов последовательно, поэтому & vec [i] должен работать. Но это не означает, что указатель будет нулевым. Для использования с atoi или atol вам нужна строка с нулевым завершением.

Самым безопасным способом было бы скопировать ее в станд :: строка

std::string tmp(&vec[i], 9); // if substring is 9 characters long 

Теперь используйте tmp.c_str(), это гарантированно будет нулем.

+0

В C++ 11 вы также можете использовать 'vec.data() + i' вместо' & vec [i] '. – TheBuzzSaw

+0

Это, кажется, не работает - я поставлю редактирование в свой вопрос. – user997112

+0

Я поставил содержимое 8 байтов в моем исходном вопросе. – user997112

1

В коде

const char* c = tmp.c_str(); 
p = atol(c); 

Результаты в непредсказуемое поведение, так как указатель, возвращаемый из c_str() является временным.

Попробуйте это:

p = atol(tmp.c_str()); 
1
memcpy(&p, &My_Vector[25], 8); 

или

p = * ((long *) &My_Vector[25]); 

Всегда предполагая порядок байт правильно.

+0

Просто чтобы подтвердить, какой тип должен быть в вашей первой возможности? Я спрашиваю, потому что я объявлял p как длинный, а затем я закончил с ошибкой времени выполнения стека. – user997112

+0

memcpy не заботится - он использует void * – ravenspoint

+0

Хммм. Я поставил свой код в исходный вопрос (и сообщение об ошибке). Если бы вы могли помочь, было бы весьма полезно. – user997112

Смежные вопросы