我正在通过udp套接字连接接收缓冲区。代码是c ++。输出如下:
>>375.5,25.3
,数字之间用逗号分隔,并且不包含空格。每隔100毫秒就会发送一组新的数字。就像这样:
>>375.5,25.3
>>435.6,0.0
>>2500.34,55.2
以此类推。
对于每个新集合,我试图将第一个数字放入var1,将第二个数字放入var2。 var1和var2不是数组。想象一下,我只需要打印以下内容:
>>var1=375.5
var2=25.3
>>var1=435.6
var2=0.0
这是我正在使用的代码:
recv_len = recvfrom(s, buff, sizeof(buff), 0, (struct sockaddr *)&si_other, (socklen_t*)&slen);
if (recv_len== -1)
{
printf("Receiving message failed");
exit(0);
}
buff[recv_len] = '\0';
std::vector<int> vect;
std::stringstream ss(buff);
int i;
while (ss >> i)
{
vect.push_back(i);
if (ss.peek() == ',' || ss.peek() == ' ')
ss.ignore();
}
var1 = vect.at(0);
var2 = vect.at(1);
printf("Received packet from %s:%d\nData:%s\n\n",inet_ntoa(si_other.sin_addr),ntohs(si_other.sin_port),buff);
cout<<var1<<endl;
cout<<var2<<endl;
我得到的输出是一个错误,大小约为1。(对不起,我没有保存此输出以提供确切的错误输出。我明天将进行编辑。)当我注释掉“ var2 = vect.at(1)”,输出为:
>>Received packet from 127.0.0.1:31029
Data: 375.5,25.3
375.5
0
因此它表明我同时需要两个数字,但不允许我将它们分开。我从这里得到逗号分隔: Parsing a comma-delimited std::string 但给我一个错误。
我只需要在每次出现时都将缓冲区分开:
>>375.5,25.3
出现,输入var1 = 375.5和var2 = 25.3,然后
>>435.6,0.0
出现,将var1 = 435.6和var2 = 0.0
>>2500.34,55.2
出现,将var1 = 2500.34和var2 = 55.2
,依此类推。
---------------------编辑------------------------- ---
我会从上面忘记的错误是:
>>Terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)
答案 0 :(得分:1)
您找到的答案适用于整数,而不适用于浮点数。无论如何,这个问题很容易解决。如果您确定缓冲区的格式(即2个浮点数,用逗号分隔,没有空格),则解决方案可能如下所示:
char buff[] = "375.5,25.3";
std::string s(buff);
std::cout << std::stof(s.substr(0, s.find(','))) << std::endl;
std::cout << std::stof(s.substr(s.find(',')+1, s.size())) << std::endl;
您基本上可以只使用substr
创建2个子字符串:一个在逗号前,另一个在逗号后,然后使用stof
将其转换为浮点值。
如果您需要更强大的功能,请查看at this answer,以获得更完整的代码来分割字符串并捕获stof可能引发的异常。