一个处理Commandline的小程序

Cplusplus
老刘001
初来炸道
初来炸道
帖子: 1
注册时间: 2017年03月17日 23:58
拥有现金: 锁定
Been thanked: 2 times
联系:

一个处理Commandline的小程序

帖子 #1 老刘001 » 2019年09月10日 19:38

帮网友写的从字符串中获取参数的小程序,会保存每个参数的指针到数组。
空格为参数分隔符,半角双引号包裹的空格不算分隔符,会去掉所有的半角双引号。半角双引号个数为奇数时最后一个双引号和字符串的余下部分算一个参数。
字符串长度、参数个数要提前获取,数组也要提前声明。
由于是在单片机中跑,所以用了快慢指针,直接处理源字符串,不耗费额外空间,时间复杂度最差、最好、平均均为O(n),n代表字符串长度。

Code: [全选] [展开/折叠] [Download] (CmdlineSpliter.C)
  1. #include <stdio.h>
  2. int main () {
  3.     char str[] = "\"  \" ←开头空引号 var -set abc →结尾空引号 \"    \" ";
  4.     printf("字符串:【%s】",str);
  5.     int length = sizeof(str);
  6.     char *lp[7];
  7.  
  8.     int another_i = 0,ptr = 0,i = 0;
  9.     int flag1 = 0; //是否在引号内的flag
  10.     int flag2 = 1; //是否是字段首字符的flag
  11.     for(i=0;i<=length;i++){
  12.         if(str[i] == 0x00){str[another_i]=str[i];}
  13.         if(str[i] == '"'||str[i] == 0x00){  //引号
  14.             flag1 = !flag1 ;
  15.         }else{
  16.             if(str[i] == ' '){  //空格
  17.                 if(flag1 == 0){ //引号外的空格
  18.                     str[i]=0x00;
  19.                     flag2 = 1;
  20.                 }else{  //引号中的空格
  21.                     if(flag2==1){   //写入指针
  22.                         lp[ptr] = str + another_i;
  23.                         ptr++;
  24.                         flag2 = 0;
  25.                     }
  26.                 }
  27.             }else{  //正常字符
  28.                 if(flag2==1){   //写入指针
  29.                     lp[ptr] = str + another_i;
  30.                     ptr++;
  31.                     flag2 = 0;
  32.                 }
  33.             }
  34.             str[another_i]=str[i];
  35.             another_i++;
  36.         }
  37.     }
  38.     for(i=0;i<sizeof(lp)/sizeof(char *);i++){
  39.         printf("参数%d:【%s】",i+1,lp[i]);
  40.     }
  41. }

在线测试:https://tool.lu/coderunner/embed/6jx.html

头像
523066680
Administrator
Administrator
帖子: 480
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 52 times
Been thanked: 93 times
联系:

Re: 一个处理Commandline的小程序

帖子 #2 523066680 » 2019年09月11日 21:30

Code: [全选] [展开/折叠] [Download] (Untitled.c)
  1. #include <stdio.h>
  2. int
  3. main ()
  4. {
  5.     char str[] =
  6.         "\"  \" ←开头空引号 var -set abc →结尾空引号 \"    \" ";
  7.     printf ("字符串:【%s】", str);
  8.     int length = sizeof (str);
  9.     char *lp[7];
  10.  
  11.     int another_i = 0, ptr = 0, i = 0;
  12.     int flag1 = 0;      //是否在引号内的flag
  13.     int flag2 = 1;      //是否是字段首字符的flag
  14.     for (i = 0; i <= length; i++)
  15.     {
  16.         if (str[i] == 0x00)
  17.         {
  18.             str[another_i] = str[i];
  19.         }
  20.         if (str[i] == '"' || str[i] == 0x00)
  21.         {
  22.             //引号
  23.             flag1 = !flag1;
  24.         }
  25.         else
  26.         {
  27.             if (str[i] == ' ')
  28.             {
  29.                 //空格
  30.                 if (flag1 == 0)
  31.                 {
  32.                     //引号外的空格
  33.                     str[i] = 0x00;
  34.                     flag2 = 1;
  35.                 }
  36.                 else
  37.                 {
  38.                     //引号中的空格
  39.                     if (flag2 == 1)
  40.                     {
  41.                         //写入指针
  42.                         lp[ptr] = str + another_i;
  43.                         ptr++;
  44.                         flag2 = 0;
  45.                     }
  46.                 }
  47.             }
  48.             else
  49.             {
  50.                 //正常字符
  51.                 if (flag2 == 1)
  52.                 {
  53.                     //写入指针
  54.                     lp[ptr] = str + another_i;
  55.                     ptr++;
  56.                     flag2 = 0;
  57.                 }
  58.             }
  59.             str[another_i] = str[i];
  60.             another_i++;
  61.         }
  62.     }
  63.     for (i = 0; i < sizeof (lp) / sizeof (char *); i++)
  64.     {
  65.         printf ("参数%d:【%s】", i + 1, lp[i]);
  66.     }
  67. }


highlight-gui 格式化了一下 又显得太占行数了


回到 “C/C++”

在线用户

用户浏览此论坛: 没有注册用户 和 0 访客