我有一个如下的字符数组:
char array[] = "AAAA... A1... 3. B1.";
如何在Arduino中通过字符串"..."
拆分此数组?我尝试过:
ptr = strtok(array, "...");
,输出如下:
AAAA,
A1,
3,
B1
但我实际上希望输出为
AAAA,
A1,
3.B1.
如何获得此输出?
编辑:
我的完整代码是这样:
char array[] = "AAAA... A1... 3. B1.";
char *strings[10];
char *ptr = NULL;`enter code here`
void setup()
{
Serial.begin(9600);
byte index = 0;
ptr = strtok(array, "..."); // takes a list of delimiters
while(ptr != NULL)
{
strings[index] = ptr;
index++;
ptr = strtok(NULL, "..."); // takes a list of delimiters
}
for(int n = 0; n < index; n++)
{
Serial.println(strings[n]);
}
}
答案 0 :(得分:3)
主要问题是strtok
不能找不到在另一个字符串中找到一个字符串。 strtok
在字符串中查找字符。当您将多个字符赋予strtok
时,它将查找其中的任何个字符。因此,写strtok(array, "...");
与写strtok(array, ".");
完全相同。这就是为什么您在“ 3”之后进行拆分的原因。
有多种方法可以做您想要的事情。下面,我将向您展示使用strstr
的示例。与strtok
不同,strstr
函数确实在字符串中找到一个子字符串-就是您要查找的内容。但是。strstr
不是标记符,因此需要一些额外的代码来打印子字符串。
类似的事情应该做:
int main()
{
char array[] = "AAAA... A1... 3. B1...";
char* ps = array;
char* pf = strstr(ps, "..."); // Find first substring
while(pf)
{
int len = pf - ps; // Number of chars to print
printf("%.*s\n", len, ps);
ps = pf + 3;
pf = strstr(ps, "..."); // Find next substring
}
return 0;
}
答案 1 :(得分:0)
除了第二个参数的作用之外,您还可以将自己的 split 实现为 strtok :
#include <stdio.h>
#include <string.h>
char * split(char *str, const char * delim)
{
static char * s;
char * p, * r;
if (str != NULL)
s = str;
p = strstr(s, delim);
if (p == NULL) {
if (*s == 0)
return NULL;
r = s;
s += strlen(s);
return r;
}
r = s;
*p = 0;
s = p + strlen(delim);
return r;
}
int main()
{
char s[] = "AAAA... A1... 3. B1.";
char * p = s;
char * t;
while ((t = split(p, "...")) != NULL) {
printf("'%s'\n", t);
p = NULL;
}
return 0;
}
编译和执行:
/tmp % gcc -g -pedantic -Wextra s.c
/tmp % ./a.out
'AAAA'
' A1'
' 3. B1.'
/tmp %
我在''之间打印以显示返回空格,因为我不确定您是否需要它们,因此delim不仅...在这种情况下
答案 2 :(得分:0)
因为您将其标记为c ++,所以这是代码的c ++“版本”:
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
#include <string>
using std::string;
class T965_t
{
string array;
vector<string> strings;
public:
T965_t() : array("AAAA... A1... 3. B1.")
{
strings.reserve(10);
}
~T965_t() = default;
int operator()() { return setup(); } // functor entry
private: // methods
int setup()
{
cout << endl;
const string pat1 ("... ");
string s1 = array; // working copy
size_t indx = s1.find(pat1, 0); // find first ... pattern
// start search at ---------^
do
{
if (string::npos == indx) // pattern not found
{
strings.push_back (s1); // capture 'remainder' of s1
break; // not found, kick out
}
// else
// extract --------vvvvvvvvvvvvvvvvv
strings.push_back (s1.substr(0, indx)); // capture
// capture to vector
indx += pat1.size(); // i.e. 4
s1.erase(0, indx); // erase previous capture
indx = s1.find(pat1, 0); // find next
} while(true);
for(uint n = 0; n < strings.size(); n++)
cout << strings[n] << "\n";
cout << endl;
return 0;
}
}; // class T965_t
int main(int , char**) { return T965_t()(); } // call functor
输出:
AAAA
A1
3. B1.
注意:我保留更改“ 3. B1”。到“ 3.B1。”,并在每行末尾添加逗号(最后一行除外),作为OP的练习(如果需要)。