2016-05-08 3 views
0

Im работает над алгоритмом на C++, а im пытается ускорить его выполнение, изменив cin на scanf. Но когда я это сделал, у меня начались ошибки SIGSEGV.Программа получила сигнал SIGSEGV при использовании scanf

int main(){ 

    int nominal; 
    int check; 
    string b; 
    int x; 
    int a; 

    int i = 0; 

    //cin >> a; 
    scanf ("%d",&a); 
    for (int i = 0; i<a; i++){ 
     //cin >> b; 
     scanf("%s",&b); 
     std::priority_queue <int> Q; 
     std::priority_queue < int, std::vector <int>, std::greater <int> > moneyBox; 
     while (b!="0"){ 

Код перестает работать при входе в первый раз. Какие-нибудь советы по его устранению?

+1

Вы не можете использовать 'std :: string' с' scanf ("% s", &b); '. Используйте' getline() 'или' cin >> b; 'вместо. –

+0

@ πάνταῥεῖ Не совсем верно. '' resize (big_enough) '', а затем '' data() '' член, а затем установите размер в правильное значение позже. – BitTickler

+1

Помимо этой технической информации - вы не ускоряете ничего с этим изменением здесь. быстродействующий шрифт, время, необходимое для записи ввода, делает разницу во времени - если есть какое-либо из ваших изменений, пренебрежимо мало. – BitTickler

ответ

0

scanf() использует символы форматирования, соответствующие заданным типам. "%s" предназначен для хранения нулевой завершенной c-строки в массиве char. scanf() поэтому неправильно интерпретирует адрес строки C++ &b как действительный char*, указывающий на предварительно выделенный массив символов достаточного размера. Это повредит память и может вызвать UB.

+0

Вы не можете «вызвать» UB. , поведение программы _has_, которое не определено. –

+0

@LightnessRacesinOrbit ok, я переформулировал – Christophe

+0

Все еще говорит, что «может вызвать UB». О хорошо. –

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