преобразование std::string в double с отрицательными значениями приводит к нулю или создает исключение

#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.

Вместо этого используется следующая последовательность кодовых точек:

Поэтому ваши попытки синтаксического анализа завершаются неудачей.

Если вы сомневаетесь, скопируйте / вставьте свой текст в шестнадцатеричный редактор или онлайн-инструмент, такой как https://babelstone.co.uk/Unicode/whatisit.html .

Всегда рассматривайте это как этап отладки, если вы столкнулись с какой-то загадочной проблемой с символами, такими как дефисы (которые сопровождаются множеством визуально похожих, но разных символов).

Так называемые «умные» кавычки — еще один хороший пример символов, гораздо менее невинных, чем они утверждают.

Комментарии:

1. На самом деле это U 2010. Всем нужен лучший текстовый редактор 🙂

2. Судя по тому, как прошел этот год, можно подумать, что это U 2020.

3. @HansPassant Так оно и есть. Это научит меня читать только одну строку вывода 🤣

4. Ваша ошибка намного интереснее, чем у OP. Приукрасьте, пожалуйста.

5. @HansPassant Рассказывать особо нечего; Я буквально только что прочитал одну строку вывода