帮网友写的从字符串中获取参数的小程序,会保存每个参数的指针到数组。
空格为参数分隔符,半角双引号包裹的空格不算分隔符,会去掉所有的半角双引号。半角双引号个数为奇数时最后一个双引号和字符串的余下部分算一个参数。
字符串长度、参数个数要提前获取,数组也要提前声明。
由于是在单片机中跑,所以用了快慢指针,直接处理源字符串,不耗费额外空间,时间复杂度最差、最好、平均均为O(n),n代表字符串长度。
#include <stdio.h>
int main () {
char str[] = "\" \" ←开头空引号 var -set abc →结尾空引号 \" \" ";
printf("字符串:【%s】",str);
int length = sizeof(str);
char *lp[7];
int another_i = 0,ptr = 0,i = 0;
int flag1 = 0; //是否在引号内的flag
int flag2 = 1; //是否是字段首字符的flag
for(i=0;i<=length;i++){
if(str[i] == 0x00){str[another_i]=str[i];}
if(str[i] == '"'||str[i] == 0x00){ //引号
flag1 = !flag1 ;
}else{
if(str[i] == ' '){ //空格
if(flag1 == 0){ //引号外的空格
str[i]=0x00;
flag2 = 1;
}else{ //引号中的空格
if(flag2==1){ //写入指针
lp[ptr] = str + another_i;
ptr++;
flag2 = 0;
}
}
}else{ //正常字符
if(flag2==1){ //写入指针
lp[ptr] = str + another_i;
ptr++;
flag2 = 0;
}
}
str[another_i]=str[i];
another_i++;
}
}
for(i=0;i<sizeof(lp)/sizeof(char *);i++){
printf("参数%d:【%s】",i+1,lp[i]);
}
}
在线测试:
https://tool.lu/coderunner/embed/6jx.html