如何在C ++中读取字符串中的多个双精度数,用空格分隔?

时间:2014-11-08 04:02:30

标签: c++ string double

我需要读取一个字符串,例如:



string str = "3 - 90.2 85.54 93.0";




......采用这种格式。第一个数字显示双打的数量,然后是" ="然后用空格分隔的那么多个双打)。 我知道如何读取第一个数字作为int来查找双精度数。然而,困扰我的是阅读双打。我尝试使用stod函数。



string str = "90.2 85.54 93.0";
size_t sz;

double x = stod(str,&sz);
double y = stod(str.substr(sz));
double z = stod(str.substr(sz));




但是,这只能读取2个双打,因为str.substr(sz)将读取到字符串的末尾,而双精度数可以是不同的小数(可能是89.54或89或89.6),所以我不能使用substr因为这需要我知道从起始索引读取多少个字符。

有没有办法读取这些未知数量的未知数量的十进制数字?是否有另一种方法如substr来读取特定的索引或字符? 我只是希望他们能够一个接一个地阅读。我以后可以把它存储成一个双数组(我知道该怎么做)。

6 个答案:

答案 0 :(得分:4)

你可以使用stringstream

string str = "3 - 90.2 85.54 93.0";
stringstream ss(str);
int num;   ss >> num; //read 3
char c;    ss >> c;    // read "-"
double d1; ss >> d1;   // read 1
double d2; ss >> d2;   // read 2
double d2; ss >> d2;   // read 3

答案 1 :(得分:1)

使用istream_iterator s。

std::vector<double> xyzzy{std::istream_iterator<double>{std::istringstream{str}}, std::istream_iterator{}};

请注意,流在GCC中没有移动构造函数,因此如果您正在使用GCC,则需要声明istringstream并传递对它的引用,如下所示:

std::istringstream temp{str};
std::vector<double> xyzzy{std::istream_iterator<double>{temp}, std::istream_iterator{}};

答案 2 :(得分:0)

函数strtok()对于解析大字符串中的内容非常有用。一旦你指向每个double,然后使用对atof()的调用转换它。

  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ");
  while (pch != NULL)
  {
     printf ("%s\n",pch);
     pch = strtok (NULL, " ");
  }

答案 3 :(得分:0)

您可以重复代码:

double x = stod(str, &sz);
str = str.substr(sz);
double y = stod(str, &sz);
str = str.substr(sz);
double z = stod(str, &sz);
str = str.substr(sz);
double x1 = stod(str, &sz);

参见文档:

double stod(const string &  str, size_t * idx = 0);
  • str:具有浮点表示的String对象 号。
  • idx:指向size_t类型的对象的指针,其值由 函数到str之后的下一个字符的位置 数值。此参数也可以是空指针,其中 如果没有使用它。

答案 4 :(得分:-1)

您甚至可以使用while循环拆分字符串,字符串中没有浮点数限制,因为这将在字符串结束时结束,执行此操作:

int i=0, p=0;
float fdigit=0;
char string[]="9.0 5.4 2.6", floats[10];
while (floats[i]!='\0')
{
while (floats[i]!=' ')
{
floats[p]=floats[i];
p++;
i++;
floats[p]='\0';
fdigit=atof(floats);
cout<<fdigit<<"\n";
}
if (floats[i]==' ')
i++;
}

另外不要忘记输入stdlib.h,因为atof在stdlib.h库中,atof()只是将字符串浮点数转换为类型浮点数,希望这有助于你,如果你有任何问题,那么问我,不要&# 39;毫不犹豫地问我,兄弟......

编辑:如果这对你有帮助,也不要忘记对我的问题投+1票。

答案 5 :(得分:-1)

std::string str = "3 - 90.2 85.54 93.0";
std::stringstream ss(str);
int num;   ss >> num;
char c;    ss >> c;
std::vector arr;
arr.reserve(num);
for (int i = 0; i < num; ++i)
{
    double d; ss >> d;
    arr.push_back(d);
}