由字符串到浮点数转换的小问题
现在我通讯程序里 收到的字符串为“[01]32.9[02]54.6[03]84.6[04]45.4";
请问我怎么样才可以 把 32.9 54.6 84.6 45.4 几个数分别付给 float a1 a2 a3 a4;呢?
问题点数:0、回复次数:8Top
1 楼stukov2002(卡拉是头猪)回复于 2003-06-01 10:07:08 得分 0
#include <string.h>
#include <stdio.h>
char string[] = “[01]32.9[02]54.6[03]84.6[04]45.4";
char seps[] = "[";
char *token;
float a[10];
void main( void )
{
int n = 0;
token = strtok( string, seps );
while( token != NULL )
{
a[n] = atof(token + 4);
printf("%s\t", token + 4);
printf("%f\n", a[n];
n ++;
token = strtok( NULL, seps );
}
}
Top
2 楼bigtea(企鹅)回复于 2003-06-01 11:47:09 得分 0
楼上的方法是以'['开始加4个字符,开始读取有效值。但如果是'[101]43.55[567]45.5'字符串呢。
判断一个('[',']')后,开始读取有效值。是否更好一些。
Top
3 楼fangrk(加把油,伙计!)回复于 2003-06-01 12:06:13 得分 0
#include <string>
#include <sstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
const string str1("[0.1]32.9[02]54.6[03.]84.6[04]45.4[101]43.55[567]45.5[1.23]3.14");
char NoUseChar;//'[' or ']'
float NoUseFloat;
float ExtractFloat;
istringstream ss(str1);
vector<float> Data;
while(true){
ss>>NoUseChar>>NoUseFloat>>NoUseChar>>ExtractFloat;
if(ss.fail()) break;
Data.push_back(ExtractFloat);
}
copy(Data.begin(),Data.end(),ostream_iterator<float>(cout,"\t"));
}
C:\temp>bcc32 -WR -WC csdn.cpp
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
csdn.cpp:
Turbo Incremental Link 5.64 Copyright (c) 1997-2002 Borland
C:\temp>csdn
32.9 54.6 84.6 45.4 43.55 45.5 3.14
C:\temp>Top
4 楼hyifeng()回复于 2003-06-01 13:04:26 得分 0
fangrk的方法总是令人喜欢Top
5 楼hyifeng()回复于 2003-06-01 14:16:25 得分 0
还有一种办法,不知道比起fangrk的效率如何:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
int main(int argc,char** argv) {
std::vector<float> data;
std::string text("[0.1]32.9[02]54.6[03.]84.6[04]45.4[101]43.55[ABC]45.5[1.23]3.14");
std::string::const_iterator start(text.begin()), end(text.end());
boost::regex expression("\\[[^\\]]*\\]([^\\[]+)");
boost::match_results<std::string::const_iterator> what;
unsigned int flags = boost::match_default;
while(boost::regex_search(start, end, what, expression, flags)) {
try {
data.push_back(
boost::lexical_cast<float>(std::string(what[1].first, what[1].second))
);
} catch(boost::bad_lexical_cast& e) {
std::cerr << e.what();
return 1;
}
start = what[0].second;
flags |= boost::match_prev_avail;
flags |= boost::match_not_bob;
}
std::copy(data.begin(), data.end(), std::ostream_iterator<float>(std::cout, " "));
return 0;
}Top
6 楼zzyyjj(学海无崖)回复于 2003-06-02 11:14:37 得分 0
高手!
但如果是"[07]32.9[03]54.6[05]84.6[04]45.4[01]43.55[02]45.5F
如果要根据括号里的数i 分配给 float a[i]呢
^_^Top
7 楼peon(加菲-加菲 一只特立独行的猫)回复于 2003-06-02 11:42:03 得分 0
sscanfTop
8 楼hyifeng()回复于 2003-06-02 12:26:51 得分 0
我的程序或fangrk前辈的程序稍作更改就可以了:
while(true){
ss>>NoUseChar>>UsefulInt/*原来没用,现在有用了*/>>NoUseChar>>ExtractFloat;
if(ss.fail()) break;
a[UsefulInt] = ExtractFloat;
}
Top




