#c
#c
Вопрос:
Контекст
Число считывается из входного файла как a std::string
и преобразуется в a double
.
Мое решение
Я пробовал различные подходы, основанные на том, что я мог найти в Интернете:
std::string str = "‐12.5799";
std::cout << str << std::endl;
double d;
std::stringstream(str) >> d;
std::cout << d << std::endl;
std::cout << atof(str.c_str()) << std::endl;
std::cout << stod(str) << std::endl;
Проблема
Кажется, это хорошо работает, когда из файла считывается положительное число, но приводит к странным ошибкам и исключениям, когда в начале есть знак «-» std::string
.
Вывод:
‐12.5799
0
0
stod
Я, очевидно, что-то упускаю?
Комментарии:
1. Что заставляет вас думать
-
, что это актуально? Получаете ли вы ожидаемые результаты для положительных значений?2. Этот символ
"‐"
не является отрицательным знаком, это дефис (реальный отрицательный знак выглядит похожим"-"
, но это другой символ)3. @ArnaudBecheler Вставив его в babelstone.co.uk/Unicode/whatisit.html
4. Мне пришлось сбросить его в шестнадцатеричный формат (AD 2D 31 32 2E 35 37 39 39), чтобы увидеть, что там был лишний байт. Не заблуждайтесь, это неприятная вещь, которую нужно заметить. Другой трюк — сохранить файл как ASCII и посмотреть, есть ли какие-либо жалобы.
5. Тем не менее, результат, который вы получили,
stod
интересен. Возможно, это просто плохо отформатированный необработанный текст исключения
Ответ №1:
Это не обычный символ дефиса / минуса ASCII.
Вместо этого используется следующая последовательность кодовых точек:
- U 00AD: МЯГКИЙ ДЕФИС [SHY] {произвольный дефис}
- U 2010: ДЕФИС
Поэтому ваши попытки синтаксического анализа завершаются неудачей.
Если вы сомневаетесь, скопируйте / вставьте свой текст в шестнадцатеричный редактор или онлайн-инструмент, такой как https://babelstone.co.uk/Unicode/whatisit.html .
Всегда рассматривайте это как этап отладки, если вы столкнулись с какой-то загадочной проблемой с символами, такими как дефисы (которые сопровождаются множеством визуально похожих, но разных символов).
Так называемые «умные» кавычки — еще один хороший пример символов, гораздо менее невинных, чем они утверждают.
Комментарии:
1. На самом деле это U 2010. Всем нужен лучший текстовый редактор 🙂
2. Судя по тому, как прошел этот год, можно подумать, что это U 2020.
3. @HansPassant Так оно и есть. Это научит меня читать только одну строку вывода 🤣
4. Ваша ошибка намного интереснее, чем у OP. Приукрасьте, пожалуйста.
5. @HansPassant Рассказывать особо нечего; Я буквально только что прочитал одну строку вывода