从字符串中提取整数

时间:2017-03-21 21:00:03

标签: c++ string int

我试图从Arduino上的字符串中提取几个整数。我使用的Bluefruit蓝牙模块已经链接到我的手机上。

我的手机上的应用程序通过Bluefruit的TX / RX向Arduino发送一串数据。

我成功地从应用程序接收数据,我可以在计算机上的串行监视器中看到它。字符串采用以下格式:x:xxx,xxx,xxx,第一个数字为1到6,其他数字为3到0-255。

例如:1:171,54,201

该字符串还包括一个回车符,因为下一个字符串总是从一个新行开始。

任何人都可以帮我提取这些整数并将它们设置为变量吗?

2 个答案:

答案 0 :(得分:1)

您可以使用C sscanf()功能:

#include <stdio.h>

char line[] = "1:171,54,201"; // read a line from Bluetooth
int num1, num2, num3, num4;

if (sscanf(line, "%d:%d,%d,%d", &num1, &num2, &num3, &num4) == 4)
{
    // use numbers as needed
}

或C ++包装器std::sscanf()

#include <cstdio>

char line[] = "1:171,54,201"; // read a line from Bluetooth
int num1, num2, num3, num4;

if (std::sscanf(line, "%d:%d,%d,%d", &num1, &num2, &num3, &num4) == 4)
{
    // use numbers as needed
}

如果您有可用的STL(显然Arduino没有),您可以使用STL std::istringstream类代替:

#include <string>
#include <sstream>

std::string line = "1:171,54,201"; // read a line from Bluetooth
int num1, num2, num3, num4;

std::istringstream iss(line);
char ignore;

if (iss >> num1 >> ignore >> num2 >> ignore >> num3 >> ignore >> num4)
{
    // use numbers as needed
}

可替换地:

#include <string>
#include <sstream>

bool readInt(std::istream &in, char delim, int &value)
{
    std::string temp;
    if (!std::getline(in, temp, delim)) return false;
    return (std::istringstream(temp) >> value);
}

std::string line = "1:171,54,201"; // read a line from Bluetooth
int num1, num2, num3, num4;

std::istringstream iss(line);

if (readInt(iss, ':', num1) && readInt(iss, ',', num2) && readInt(iss, ',', num3) && readInt(iss, '\n', num4))
{
    // use numbers as needed
}

答案 1 :(得分:0)

通过快速谷歌搜索类似的问题,我发现an example如何使用以下代码将字符串IP地址转换为数字:

std::string ip ="192.168.1.54";
std::stringstream s(ip);
int a,b,c,d; //to store the 4 ints
char ch; //to temporarily store the '.'
s >> a >> ch >> b >> ch >> c >> ch >> d;

但是,由于您的问题“略有”不同,您可以执行以下操作:

std::string givenExample = "1:171,54,201"

//Since it is known that the value will be 1-6, just take
//the ASCII value minus 30 hex (or '0') to get the actual value.
int firstNumber = ((int)givenExample.at(0) - 0x30); //or minus '0'

givenExample.erase(0, 2); //Remove "1:" from the string

std::stringstream s(givenExample);
int secondNumber, thirdNumber, fourthNumber;
char ch;
s >> secondNumber >> ch >> thirdNumber >> ch >> fourthNumber;

但是,如果将第一个示例与第二个示例进行比较,则ip字符串的格式与示例几乎相同:4个以字符分隔的整数。所以两者都会起作用,取决于哪一个对你更有意义。

至于你将如何读取数据(处理回车),这取决于你从Arduino收到的串行数据流的接口。