我需要读取一个字符串,例如:
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来读取特定的索引或字符? 我只是希望他们能够一个接一个地阅读。我以后可以把它存储成一个双数组(我知道该怎么做)。
答案 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);
}