जब तक '\ n' दर्ज नहीं किया जाता है, तब तक मैं चार से चार संख्या की एक स्ट्रिंग पढ़ रहा हूं।

vector <char> pay;
vector <char> :: iterator p;
char x;
char maxdigit;
if(flag==1)
{
    cin.ignore();       // to ignore the first enter key press, after the test case         
    flag=0;
}

for(long long int i=0; ; i++)
{
    cin.get(x);     // The >> operator doesn't detect the ENTER key, so the loop won't end
    if(x=='\n') 
        break;
    pay.push_back(x);
}

दर्ज की गई संख्या को कम करने के लिए निकालने के लिए अधिकतम अंक या सबसे अच्छा अंक ढूँढना।

if(pay[1]=='0')
{
    pay.erase(pay.begin());
    while(pay[0]=='0')
        pay.erase(pay.begin());
}
else
{
    maxdigit=*max_element(pay.begin(),pay.end());
    p = find(pay.begin(),pay.end(),maxdigit);
    pay.erase(p);   
}

लेकिन मैं एक sigsegv त्रुटि प्राप्त कर रहा हूँ, किसी भी मदद की सराहना की जाएगी।

2
Parth Katlana 8 जिंदा 2020, 12:17

1 उत्तर

सबसे बढ़िया उत्तर

हां आपके कोड में कई जगह हैं जो सीईजी गलती (या अन्य अपरिभाषित व्यवहार) का कारण बन सकती हैं:

if(pay[1]=='0') // UB if pay.size() < 2
{
    pay.erase(pay.begin());
    while(pay[0]=='0') // UB if pay.size() < 1, e.g. if pay is originally "00000" this loop has UB
        pay.erase(pay.begin()); // UB if pay.size() < 1
}
else
{
    maxdigit=*max_element(pay.begin(),pay.end()); // UB if pay is empty, max_element will return pay.end(), dereferencing this iterator is UB
    p = find(pay.begin(),pay.end(),maxdigit);
    pay.erase(p);   
}

सुरक्षित कोड होगा:

if(!pay.empty() && pay.front()=='0') // I'm assuming pay[1]=='0' was meant to be pay[0]=='0'
{
    pay.erase(pay.begin());
    while(!pay.empty() && pay.front()=='0')
        pay.erase(pay.begin());
}
else
{
    p = max_element(pay.begin(),pay.end());
    if (p != pay.end())
    {
        maxdigit = *p;
        pay.erase(p);
    } 
}
3
Alan Birtles 8 जिंदा 2020, 09:36