将双倍转换为字符数组C++
Convert double to Char Array C++
我正在尝试将双精度转换(并四舍五入(为字符数组,而无需先在双精度上使用 std::to_string 进行转换。但是,我收到的是随机内存文本。我做错了什么?
这是我的代码:
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
您正在将double
的文字字节转换为char
s。double
值是二进制表示形式(通常类似于IEEE 754(,而char
是字符的二进制表示形式(通常基于ASCII(。这两者不兼容。
不幸的是,这意味着您必须进行某种转换过程。要么是你说你不想做的std::to_string()
,要么是一个更复杂的std::stringbuf
(无论如何都会在引擎盖下调用std::to_string()
(
您正在将double
(数字的二进制表示形式(复制到char
数组中;这些字节没有理由对应于数字字符。
这没有经过测试,但你可以尝试:
std::string to_string(double x)
{
std::ostringstream ss;
ss << x;
return ss.str();
}
然后,您可以将返回的字符串的字符放入如下所示的字符数组中:
std::string str = to_string(doubleValue);
char digits[str.length()];
然后,由于Remy Lebeau的评论,您可以执行以下操作之一:
std::strncpy(digits, to_string(doubleValue).c_str(), sizeof(digits))
或者这个:
to_string(doubleValue).copy(digits, sizeof(digits))
不使用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] = ' ';
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] = ' ';
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");
}
如果你想在不使用to_string
的情况下手动转换,你将不得不一次拉出一个数字。双精度不是作为一组字符存储在内存中,因此您不能只是复制内存并希望它一切正常。(有关如何解释双打的更多信息,请参阅此处(。
先做这个:
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()] = ' ';
// use cstr as needed...
delete[] cstr;
或者,简单地说:
const char *cstr = str.c_str();
// use cstr as needed...
只需这样做:
#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;
在双精度上使用 itoa,将小数板向右移动 2,然后通过在应该在 : 之前添加小数点来创建结果的副本:
void convertToCharArray(double value, char *rezult)
{
int k;
char aux[10];
itoa(value*100, aux, 10);
int n = strlen(aux);
k = 0;
for(int i=0;i<n;i++)
{
if(i == n-1 - 1)
{
rezult[k++] = '.';
}
rezult[k++] = aux[i];
}
rezult[k++] = ' ';
}
用法:
int main()
{
char aux[10];
convertToCharArray(27.77, aux);
cout << aux;
return 0;
}
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?