Конвертировать double в Char Array C ++ - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь преобразовать (и округлить) значение типа double в массив символов без преобразования с помощью std :: to_string в double.Однако вместо этого я получаю произвольный текст в памяти.Что я делаю неправильно?

Вот мой код:

double d = 1.0929998; 
d = std::round(d * 100) / 100;

char s[sizeof(d)];
std::memcpy(s,&d,sizeof(d));

Результат:

s: q = × £ pñ?

Предполагаемое значение:

с: 1.09

Ответы [ 7 ]

0 голосов
/ 06 июня 2018

Процесс преобразования самостоятельно без использования to_string может быть следующим:

char* to_char_array(double num_double, int decimal_place)
{
    int num_int = std::round(num_double * pow(10, decimal_place));
    int sign = num_int < 0 ? 1 : 0;
    num_int = abs(num_int);

    if (num_int == 0)
    {
        char* s = (char*)malloc(decimal_place + 3);
        s[0] = '0';
        s[1] = '.';
        for (int i = 2; i < decimal_place + 2; i++)
            s[i] = '0';
        s[decimal_place + 2] = '\0';
        return s;
    }

    int digit_count = 1;
    int n = num_int;
    if (n >= 100000000) { digit_count += 8; n /= 100000000; }
    if (n >= 10000) { digit_count += 4; n /= 10000; }
    if (n >= 100) { digit_count += 2; n /= 100; }
    if (n >= 10) { digit_count++; }

    int size = digit_count + 1 + (decimal_place > 0 ? 1 : 0) + sign;
    char* s = (char*)malloc(size);

    for (int i = 0, integer = num_int; integer != 0; integer /= 10) {
        s[size - 2 - i++] = integer % 10 + 48;
        if (decimal_place > 0 && i == decimal_place)
            s[size - 2 - i++] = '.';
    }
    s[size - 1] = '\0';
    if (sign)
        s[0] = '-';
    return s;
}

void main()
{
    double d = -12.268904;
    char* s = to_char_array(d, 3);
    cout << "double: " << d << " - char array: " << s << endl;
    system("pause");
}
0 голосов
/ 29 марта 2019

просто сделайте это:

  #include <iostream>
  #include <string>
  #include <sstream>

  using namespace std;

  int main()
  {
      double a=23.25;
      char b[12];
      stringstream ss;

      ss << a;
      ss >> b;
      cout << b << endl;

      return 0;
  }

или это:

  #include <iostream>
  #include <string>
  #include <sstream>
  #include <stdio.h>


  using namespace std;

  int main()
  {


  double a=23.25;
  char b[12];
  stringstream ss  ;
  ss<<a;
  sprintf(b,ss.str().c_str());
  cout<<b<<endl;
  return 0;

или это:

here don't forget to
 #include<bits/stdc++.h>
  
  double a=23.25;
  char b[12];
  stringstream ss  ;
  ss<<a;
  strcpy(b,ss.str().c_str());
  cout<<b<<endl;
  return 0;
0 голосов
/ 06 июня 2018

Это не проверено, но вы можете попробовать:

std::string to_string(double x)
{
    std::ostringstream ss;
    ss << x;
    return ss.str();
}

Затем вы можете поместить символы возвращаемой строки в массив символов следующим образом:

std::string str = to_string(doubleValue);
char digits[str.length()];

И затем, спасибона комментарий Реми Лебо вы можете сделать это:

std::strncpy(digits, to_string(doubleValue).c_str(), sizeof(digits))

или это:

to_string(doubleValue).copy(digits, sizeof(digits))
0 голосов
/ 06 июня 2018

Просто сделать это сначала:

std::ostringstream strs;
strs << dbl;
std::string str = strs.str();

Это преобразует двойной dbl в строку str.

Затем вы можете преобразовать его вмассив символов вроде этого:

char *cstr = new char[str.length()+1];
str.copy(cstr, str.length());
cstr[str.length()] = '\0';
// use cstr as needed...
delete[] cstr;

Или просто так:

const char *cstr = str.c_str();
// use cstr as needed...
0 голосов
/ 06 июня 2018

Вы переводите буквенные байты ваших double в char s.Значение double является двоичным представлением (обычно что-то вроде IEEE 754 ), в то время как char является двоичным представлением символа (обычно что-то основанное на ASCII ).Эти два несовместимы.

К сожалению, это означает, что вы должны выполнить какой-то процесс преобразования.Либо std::to_string(), который вы сказали, что не хотите делать, либо более сложный std::stringbuf (который в любом случае будет вызывать std::to_string() под капотом)

0 голосов
/ 06 июня 2018

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

0 голосов
/ 06 июня 2018

Вы копируете double (который является двоичным представлением для числа) в массив char;нет причин, по которым эти байты должны соответствовать цифрам.

...