У меня есть следующая тестовая программа:
#include <string>
int main(int argc, char* argv[]) {
try {
return std::stoi("3000127232");
}
catch (...) {
return 0;
}
}
Когда я компилирую это в Ubuntu с C++11 и запускаю код, я получаю возвращаемое значение 0. Это то, что я ожидаю, потому что значение в строке выходит за пределы допустимого диапазона.
Но когда я скомпилирую его для rasperry-buildroot 18.11, я могу запустить программу на rasperry, но получаю segfault. Этого я не ожидаю.
Есть ли другое решение для преобразования строк в целые (без segfaults, когда они выходят за пределы диапазона), или у кого-нибудь есть другая идея?
Вы получаете segfault на rasperry с некоторыми значениями в диапазоне, такими как 0
?
std::stoi
указано, чтобы генерировать исключение, если значение выходит за пределы допустимого диапазона. Если реализация этого не делает, значит, она не соответствует стандарту. Это может быть ошибка компилятора.
Если, например, вы нацелены на систему, которая не поддерживает исключения или по какой-либо другой причине не соответствует требованиям, существуют другие способы преобразования строки в целое число, не использующие исключения, например std::strtol
.
Вы можете проверить размер int на своей малине, он, вероятно, выходит за пределы допустимого диапазона.
Raspi работает на ARM, поэтому, вероятно, у него 32-битный int.
Можете ли вы отладить свою программу и посмотреть, где segfaults?