C 从以太网分割数据
我需要从以太网中分离数据。数据格式如下:C 从以太网分割数据,c,C,我需要从以太网中分离数据。数据格式如下: ZMXXX,angle*CHCK 其中角度是数字。例如:ZMXXX,900*5A 我需要分开的ZMXXX,900和5A。我写了这个函数: void split_data(char analyze[]) { char *words[5]; uint8_t i=0; words[i] = strtok(analyze,"*"); while(words[i]!=NULL) { words[++i]
ZMXXX,angle*CHCK
其中角度是数字。例如:ZMXXX,900*5A
我需要分开的ZMXXX,900
和5A
。我写了这个函数:
void split_data(char analyze[])
{
char *words[5]; uint8_t i=0;
words[i] = strtok(analyze,"*");
while(words[i]!=NULL)
{
words[++i] = strtok(NULL,"*");
}
}
结果如下:
现在,我如何从变量中获取这些数据:
words[0]
words[1]
假设您提到的格式是固定的,那么就不需要昂贵且容易出错的strtok() 使用好的旧方法: 像这样使用它:
#define _POSIX_C_SOURCE 200809L /* To make strdup() available. */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int parse(char *, char **);
int main(void)
{
char data[] = "ZMXXX,900*5A";
char * words[2];
if (-1 == parse(data, words))
{
perror("parse() failed");
exit(EXIT_FAILURE);
}
printf("word 1 = '%s'\n", words[0]);
printf("word 2 = '%s'\n", words[1]);
free(words[0]);
free(words[1]);
return EXIT_SUCCESS;
}
注意,这不是标准C,而是POSIX。可能需要使用一个适当的定义来激活它。嗯,完全一样<代码>单词[0],
单词[1]
,等等。到底是什么问题?以太网适合哪里?@EdHeal:可能那部分还没有出现。你说的“获取此数据”是什么意思?您已正确拆分数据。您可以通过立即返回来放弃示例代码中的工作。您不能从函数返回单词
,但可以在显示的循环将其拆分后使用它。或者可以重新设计函数,以便传入由函数初始化/设置的指针数组。您将返回找到的字段数,但如果格式已知且固定,则您知道答案是2。因此,您可以使用int split_data(char analyze[],char**words,int max_words)
作为签名。我需要拆分此数据:$ZMXXX,angle*CHCK
其中:ZMXXX是命令角度是角度(900=90°)CHCK=校验和,例如:$ZMXXX,900*5A
我从以太网接收的此数据,删除$and。在此之后,我得到了以下格式的数据:ZMXXX,900*5A,我需要拆分这个字符串。
#define _POSIX_C_SOURCE 200809L /* To make strdup() available. */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int parse(char *, char **);
int main(void)
{
char data[] = "ZMXXX,900*5A";
char * words[2];
if (-1 == parse(data, words))
{
perror("parse() failed");
exit(EXIT_FAILURE);
}
printf("word 1 = '%s'\n", words[0]);
printf("word 2 = '%s'\n", words[1]);
free(words[0]);
free(words[1]);
return EXIT_SUCCESS;
}
word 1 = 'ZMXXX,900'
word 2 = '5A'