gpt4 book ai didi

c++ - 字符 vector 可以越界吗?

转载 作者:行者123 更新时间:2023-12-01 14:43:41 29 4
gpt4 key购买 nike

我只是逐字符读取一个数字字符串,直到输入'\ 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++ - 字符 vector 可以越界吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59642713/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com