c++ - char vector 可以越界吗?

标签 c++ vector stl segmentation-fault

我只是逐个字符地读取一串数字,直到输入“\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 错误,如有任何帮助,我们将不胜感激。

最佳答案

是的,您的代码中有很多地方可能会导致段错误(或其他未定义的行为):

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);
    } 
}

关于c++ - char vector 可以越界吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59642713/

相关文章:

c++ - 如何创建接受二维数组的构造函数

c++ - 从 vector 中的 vector 中删除类的实例

c++ - 复合文字是标准 C++ 吗?

java - 从顶点计算二维多边形的边?

c++ - 如何推导 std::advance 迭代器类型?

c++ - 为什么std::deque的效率这么差?

c++ - 通过值获取 std::queue 中元素的索引

c++ - 设计我的方式进入 dynamic_cast 我应该如何进行?

c++ - 多次 push_back vector 的快速方法

c++ - 在C++中将对象添加到2D vector