sscanf неправильно конвертирует числа с плавающей точкой, если размер массива фиксирован - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь использовать sscanf для преобразования массива char в C в double.Моя проблема лучше всего описана в этом коротком минимальном рабочем примере:

#include <stdio.h>

int main (int argc, char **argv)
{
  char string_one[]  = "1.2e-4";
  char string_two[6] = "1.2e-4";

  double one, two;

  sscanf(string_one, "%lf", &one);
  sscanf(string_two, "%lf", &two);

  printf("%e, %e\n", one, two);

  return 0;
}

Скомпилированный с GCC и запускающий в результате исполняемый файл возвращает 1.200000e-04, 1.200000e-41 вместо того же числа дважды.Проблема не появляется, если число с плавающей запятой, которое я хочу преобразовать, имеет форму 3e4 (если нет десятичного разделителя).

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

Я думаю, что проблема может быть довольно очевидной - но, поскольку я новичок вУ меня нет идей, в чем может быть проблема.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 27 февраля 2019

char string_two[6] = "1.2e-4"; ... sscanf(string_two, "%lf", &two); ожидает сканирования строки .string_two[] не является строкой , так как в ней отсутствует нулевой символ .Результат: неопределенное поведение (UB).

Решение: застрахуйте string_two[] в строку .

...