- 论坛徽章:
- 0
|
新年快乐
字符串扫描函数[code]/*-----------------------------------------------------------------------------
字符串的强格式匹配(相对与scanf)
按照规定格式对字符串进行扫描的函数
限制条件:格式有三种%d代表扫描有符号整数,%f代表扫描长浮点数,%s代表扫描字符串
每个元素的后缀字符串最大长度为100
最多能扫描的元素数为100
除最后一个元素的后缀外,后缀串必须要不为空,否则扫描会发生问题
返回值为扫描到的值的个数
-----------------------------------------------------------------------------*/
int s_scanf(const char * str, const char * fmt, ...)
{
typedef struct
{
char sufix[100+1];/*每一个元素的后缀*/
char type;/*每一个元素的类型*/
void * addr;/*每一个元素的输出地址*/
}Telement;
int elements_len;
int i;
va_list argv ;
Telement elements[100];
char * sufix_start;
char * sufix_end;
char * value_start;/*其实可以借用前面两个变量,定义自己的变量是为了增加可读性*/
char * value_end;
char * str_end;/*输入字符串的结束位置*/
char value[1000];
va_start(argv,fmt);
/*扫描格式串*/
/*进行必要的格式检查*/
if((strlen(fmt)>;2)&&(fmt[0]=='%')&&((fmt[1]=='d')||(fmt[1]=='f')||(fmt[1]=='s')))
{
elements[0].type=fmt[1];
elements[0].addr=va_arg(argv, void *);
}
else
{
va_end(argv);
return 0;
}
sufix_start=(char *)fmt+2;
elements_len=0;
/*当sufix_start到达文件尾时,该条件也会返回NULL*/
while(((sufix_end=strchr(sufix_start,'%'))!=NULL)
&&((sufix_end[1]=='d')||(sufix_end[1]=='f') ||(sufix_end[1]=='s')))
{
memcpy(elements[elements_len].sufix, sufix_start, sufix_end-sufix_start);
elements[elements_len].sufix[sufix_end-sufix_start]='\0';
elements[elements_len+1].type=sufix_end[1];
elements[elements_len+1].addr=va_arg(argv, char *);
sufix_start=sufix_end+2;
elements_len++;
};
/*剩下的是最后一个元素的后缀,可能为空*/
va_end(argv);
strcpy(elements[elements_len].sufix, sufix_start);
elements_len++;/*elements_len最后是总元素的个数,而不是最后一个元素的下标*/
va_end(argv);
i=0;
value_start=(char *)str;
str_end=(char *)str+strlen(str);
while((i<elements_len) && (value_start<str_end))
{
value_end=strstr(value_start,elements[i].sufix);
if((value_start,elements[i].sufix[0]=='\0')||(value_end==NULL))
value_end=str_end;
memcpy(value, value_start, value_end-value_start);
value[value_end-value_start]='\0';
switch(elements[i].type)
{
case 'd':
*((int *)elements[i].addr)=atoi(value);
break;
case 'f':
*((double*)elements[i].addr)=atof(value);
break;
case 's':
memcpy((char *)elements[i].addr, value, value_end-value_start+1);
break;
}
value_start=value_end+strlen(elements[i].sufix);
i++;
}
return i;
}[/code][/b] |
|