如何从包含浮点值的字符数组中获取第一个元素?

时间:2018-03-20 06:10:25

标签: c++ arrays linux pointers

我试图从包含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

代码更改的任何建议?

3 个答案:

答案 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