gpt4 book ai didi

c - 将 char 数组拆分为单独的字符串

转载 作者:行者123 更新时间:2023-11-30 20:01:30 25 4
gpt4 key购买 nike

我的数据如下所示:

header:dataA:dataB

我试图将标题以及 dataA 和 dataB 作为单独的字符串获取。所以我写了这个函数,但可能不太好:

#define maxDataSize 50
//.....

char header[20];
char dataA[maxDataSize];
char dataB[maxDataSize];

//**** a call to the function that parse the data
getHeader(BLEcontent,1,header); // here "BLEcontent" has the incoming data
getHeader(BLEcontent,2,dataA);
getHeader(BLEcontent,3,dataB);

//***** call the function that use the data
newDataFromBLE(header,dataA, dataB);

//function that parses the data:
void getHeader( char localString[], int seperatorNum,char *newdata)
{
const char seperator=':';
int counter=0;
int divider=0;

//clear array when it has garbage it added
for( int i = 0; i < maxDataSize; ++i )
newdata[i] = (char)0;

for(int k=0;k<maxDataSize;k++)
{
if ( localString[k]== seperator )
{
counter++;
divider=k+1;
if(counter==seperatorNum)
{ return ; }
}
if( (seperatorNum-1) ==counter)
newdata[k-divider]=localString[k];
}
return ;
}

稍后当我尝试使用存储在 header/dataA/dataB 中的函数数据时:

void newDataFromBLE(char header[],char dataA[], char dataB[])
{
Serial.println("got:");
Serial.println(header);
Serial.println(dataA);
Serial.println(dataB);
if (strcmp (header,"setWifi") == 0)
//... do stuff here

我得到了一些非常奇怪的结果。例如,如果传入的数据是 setWifi:a,我会得到一个很好的结果。如果是 abcd:abc 我会得到垃圾。如果是 setWifi:a:b,我也会得到垃圾。

看来,如果我发送的内容与第一个 if 语句不对应,即使它在 if 之前,它也会给我垃圾。似乎它知道(??)即将到来的 if..

以前可以用..

最佳答案

要分割数据,您可以使用 char* strtok( char* str, const char* delim );功能。为了线程安全,请使用 char *strtok_r(char *str, const char *delim, char **saveptr);功能。

请参阅以下使用 strtok_r 函数的示例:

#include <stdio.h>
#include <string.h>

//#define maxsize 20
int main ()
{
int i = 0;
char str[] ="setWifi:dataA:dataB";
char *delimeter = ":";
char *saveptr1;
char *header = strtok_r(str, delimeter, &saveptr1);
char **dataArr = malloc(5);

for (i=0; i< 5; i++) {
dataArr[i] = strtok_r(NULL, delimeter, &saveptr1);
if (dataArr[i] == NULL)
break;
printf(" %s\n", dataArr[i]);
}


if (strcmp(header, "setWifi") == 0) {
printf("'setWifi' header was set!");
}
free(dataArr);

return 0;
}

工作示例: http://ideone.com/renn2q

输出:

 dataA
dataB
'setWifi' header was set!

The strtok_r() function is a reentrant version strtok(). The saveptr argument is a pointer to a char * variable that is used internally by strtok_r() in order to maintain context between successive calls that parse the same string.

参见:http://linux.die.net/man/3/strtok_r

关于c - 将 char 数组拆分为单独的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31377038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com