我试图从包含float的字符数组中获取第一个元素值。 字符数组大小为7,它包含两个float元素,因此可以假设大小为8.我想只得到第一个忽略第二个值的元素。 这是我的代码 -
int main()
{
char cArr[7] = {2.0085,4.52};
char* charPtr = nullptr;
charPtr=cArr;
cout<<"char[0] :"<<*charPtr<<endl;
float* fPtr =(float*)charPtr;
cout<<"char[0] :"<<*fPtr<<endl;
cout<<endl;
}
这是我的输出:
g++ b.cpp -o b.exe -std=c++0x
b.cpp: In function 'int main()':
b.cpp:6:29: warning: narrowing conversion of '2.0085000000000002e+0' from 'double' to 'char' inside { } [-Wnarrowing]
char cArr[7] = {2.0085,4.52};
^
b.cpp:6:29: warning: narrowing conversion of '4.5199999999999996e+0' from 'double' to 'char' inside { } [-Wnarrowing]
./b.exe
char[0] :
char[0] :1.43773e-42
我期待:
char[0] :2.0085
代码更改的任何建议?
答案 0 :(得分:1)
看起来你正试图让你的数组保持这个:
float fArr[2] = { 2.0085, 4.52 };
char cArr[7];
memcpy(cArr, fArr, 7);
您提供的代码不允许您访问浮动表示的字节。 memcpy
会。
但是,仍然不允许通过指针转换从char数组中读取float
。这违反了严格的别名,并导致未定义的行为。要从数组中读取四个字节并将它们视为浮点数的表示,您需要再次调用memcpy
。
答案 1 :(得分:0)
代码更改的任何建议?
你真的想要这个:
float cArr[2] = { 2.0085, 4.52 };
float *fPtr = cArr;
答案 2 :(得分:0)
如果我理解你的问题是正确的,那么你有一个逗号分隔的小数点值的文本字符串。喜欢:&#34; 2.0085,4.52&#34;
现在你要提取第一个小数点值(即&#34; 2.0085&#34;)并将其转换为浮点数(例如float f = 2.0085
)。
您的代码存在两个主要问题:
1)文本字符串初始化错误,char数组太短。
2)您无法通过投射指针进行转换。您需要调用进行转换的特殊函数(例如atof
)。
一种方法是这样的:
#include <iostream>
#include <cstring>
int main()
{
// Initialize text string with comma seperated decimal point values
char cArr[32] = "2.0085,4.52";
// Extract the first decimal point text string
char* p = std::strtok(cArr, ",");
std::cout << "First text string: " << p << std::endl;
// Convert the text representation to a float representation
float f = std::atof(p);
std::cout << "First float value: " << f << std::endl;
return 0;
}
输出:
First text string: 2.0085
First float value: 2.0085