基于C语言指令的深入分析_C 语言

这虽然只是指令解析的一部分,但这是最核心部分。完整指令为:AT+REG[admin][2][00:0C:29:AA:0B:A7]。
/****************************************************************
 **文件:GetParameters.c
 **简要描述:指令解析
 **注:1.这种情况下“AT+ABC[ha12ha[1122]”--即中间少了一个], 则解析的结果为ha12ha[1122。
        2.默认参数的大小不超过20字节
        3.最多解析三个参数。
        4.指令结尾必须为空即'\0'或'\n'。
 ***************************************************************/
 
复制代码 代码如下:

#include <stdio.h>
#include <string.h>
//保存参数的结构体
typedef struct parameters
{
 char str1[20];  //第一个参数
 char str2[20];  //第二个参数
 char str3[20];  //第三个参数
}parameters_t;
 
/***** 获取参数 **********************************************/
//返回值为获取参数的个数,-1表示指令错误
int Getparams(char* data, parameters_t* pparam)

{
 int len = 0;
 memset(pparam, 0, sizeof(parameters_t));

 //第一个参数
 {
  //如果为空或换行,则说明没有参数
  if( 0 == *data || '\n' == *data)
  {
   _ERROR("no parameter!");
   return 0;
  }
  //如果为'['字符,则说明后面还有参数
  if( strncmp(data, "[", 1) )
  {
   _ERROR("first parameter err:  can't find '['");
   return -1;
  }
  data += 1;
  //如果'['后有']'结束字符,则说明参数有效
  if( !strstr(data, "]") )
  {
   _ERROR("first parameter err:  can't find ']'");
   return -1;
  }
  //得到第一个参数的长度
  len = strstr(data, "]") - data;
  if(20 <= len)
  {
   _ERROR("param one is too long!");
   return -1;
  }
  //得到第一个参数
  strncpy(pparam->str1, data, len);
  //printf("str1 : %s\n", pparam->str1);
 }

 //第二个参数
 {
  data += (len + 1);
  //如果为空,则说明只有一个参数
  if( 0 == *data || '\n' == *data)
  {
   //printf("only one parameter!\n");
   return 1;
  }
  //如果为'['字符,则说明后面还有参数
  if( strncmp(data, "[", 1) )
  {
   _ERROR("second parameter err:  can't find '['");
   return -1;
  }
  data += 1;
  //如果'['后有']'结束字符,则说明参数有效
  if( !strstr(data, "]") )
  {
   _ERROR("second parameter err:  can't find ']'");
   return -1;
  }
  len = strstr(data, "]") - data;
  if(20 <= len)
  {
   _ERROR("param two is too long!");
   return -1;
  } 
  //得到第二个参数
  strncpy(pparam->str2, data, len);
  //printf("str2 : %s\n", pparam->str2);
 }

 //第三个参数
 {
  data += (len + 1);
  if( 0 == *data || '\n' == *data)
  {
   //printf("only two parameter!\n");
   return 2;
  }
  if( strncmp(data, "[", 1) )
  {
   _ERROR("third parameter err:  can't find '['");
   return -1;
  }
  data += 1;
  if( !strstr(data, "]") )
  {
   _ERROR("third parameter err:  can't find ']'");
   return -1;
  }
  len = strstr(data, "]") - data;
  if(20 <= len)
  {
   _ERROR("param three is too long!");
   return -1;
  } 
  strncpy(pparam->str3, data, len);
  //printf("str3 : %s\n", pparam->str3);
 }

 data += (len + 1);
 if( 0 != *data && '\n' != *data)
 {
  _ERROR("too much parameter!");
  return -1;
 } 

 return 3;
}
 

这就是指令(字符串)解析,目的是获取参数.

时间: 2024-09-20 15:08:14

基于C语言指令的深入分析_C 语言的相关文章

解析C++中的for循环以及基于范围的for语句使用_C 语言

for循环语句 重复执行语句,直到条件变为 false. 语法 for ( init-expression ; cond-expression ; loop-expression ) statement; 备注 使用 for 语句可构建必须执行指定次数的循环. for 语句包括三个可选部分,如下表所示. for 循环元素 下面的示例将显示使用 for 语句的不同方法. #include <iostream> using namespace std; int main() { // The co

C语言泛型编程实例教程_C 语言

本文实例讲述了C语言泛型编程的方法,分享给大家供大家参考之用.具体分析如下: 首先,泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同.在C语言中,可以通过一些手段实现这样的泛型编程.这里介绍一种方法--通过无类型指针void* 看下面的一个实现交换两个元素内容的函数swap,以整型int为例: void swap(int* i1,int* i2){ int temp; temp = *i1; *i1 = *i2; *i2 = temp; } 当你想交换两个

C语言冒泡排序法心得_C 语言

记得以前在大学里学习c语言的时候,刚开始是很吃力的. 入门级别的算法中有个叫冒泡排序法,也有称为气泡排序法.那时候刚接触它就对它的名字特别感兴趣,因为觉得很有意思.好了,废话不多说了,我们先一起简单回忆下这个冒泡排序法.  一.打印行和列一般是这样的一个简单代码,输出4行4列*: for(int i = 1,i < 5,i++){ for(int j = 1,j < 5,j++){ printf("*"); } printf("n\"); }  二.打印

C语言字符串大小比较_C 语言

C语言字符串大小比较 #include <stdio.h> #include <string.h> int fun(char *a,char *b) { int i = 0,j = 0; while(a[i]&&b[j]) { if(a[i]-b[j]>0) return 1; else if(a[i]-b[j]<0) return -1; i++,j++; } if(strlen(a)==i&&strlen(b)==j) return

12个关于C语言的有趣问答_C 语言

本文汇总了12个关于C语言的问答,对于加深对C语言程序设计的难点理解很有帮助,读者可参考一下: 1.gets() 方法 问:以下代码有个被隐藏住的问题,你能找到它吗? 答:这个不显眼的问题就是使用了 gets() 方法.此方法接受一个string类型参数,但是却没有检测此数值是否 有足够的空间来拷贝数据.所以这里我们一般用 fgets() 方法将来的更好. #include<stdio.h> int main(void) { char buff[10]; memset(buff,0,sizeo

浅谈C语言的字符串分割_C 语言

说起来很有意思,自认为对C语言理解得还是比较深刻的.但居然到今天才知道有个strtok函数,试用了一下突然感慨以前做了多少重复劳动.每次需要解析配置文件,每次需要分割字符串,居然都是自己去分割字符串,既累人又容易出错.感概技术学得不够全面啊!这里引用一段strtok用法: The strtok() function returns a pointer to the next "token" in str1, where str2 contains the delimiters that

原创的C语言控制台小游戏_C 语言

最开始左上色块被感染,通过切换颜色,不断感染同色色块.亮点是可以切换图案,设置方块个数和最大限制次数.整体还是比较满意,希望大神指教. #include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h> #include <stdlib.h> int DIFFICULT=44; int count=0 ; int TYPE_SHAPE=2 ; int flag=

C语言 数据类型详细介绍_C 语言

C 数据类型 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式. C 中的类型可分为以下几种: 序号 类型与描述 1 基本类型: 它们是算术类型,包括两种类型:整数类型和浮点类型. 2 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量. 3 void 类型: 类型说明符 void 表明没有可用的值. 4 派生类型: 它们包括:指针类型.数组类型.结构类型.共用体类型和函数类型.

C语言实现冒泡排序算法_C 语言

BubblSort.c #include<stdio.h> void BubbleSort(int a[],int len) { int i; int j; int h; int temp; for(i=0;i<len-1;++i) { for(j=len-1;j>i;--j) { if(a[j]<a[j-1]) { temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; } } for(h=0;h<len;h++) { printf(" %