代码如下:
/************************************************************************
* 文件名:parameter
* 文件功能描述:参数解析
* 文件作者名:Mr_han QQ:785937095
* 说明:
* 1、参数分隔符为空格
* 2、对于用" "包含起来的参数,如果中间有空格,不能解析为多个参数。
* 3、参数不定长
* 4、输入由用例保证,不会出现不符合要求的输入
**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LONG long
#define CHAR char
#define N 128
/*用来检索字符串后面是否有与该 " 对称的 " */
LONG Find ( CHAR buf[] )
{
LONG i = 0;
while ( '\0' != buf[i++] )
{
if ( '"' == buf[i] && ' ' == buf[i+1] ) /*限制该 " 后面必须是空格,以免在字符中间*/
return 1; /*有的话返回1*/
}
return 0; /*没有返回0*/
}
/*用来将几组命令符输出*/
void Print ( CHAR buf[] )
{
LONG n, i, j;
CHAR par[N] = "";
n = i = j = 0;
strcat ( buf, " " );
while ( '\0' != buf[i] )
{
if ( 0 == j && '"' == buf[i] && 1 == Find ( buf + i + 1 )) /*当 " 位于空格后的第一个字符,并且后面有与之对应的 " */
{
while ( '"' != buf[i+1] )
{
par[j] = buf[i+1];
j++;
i++;
}
par[j] = '\0';
i+=2;
}else
{
if ( ' ' != buf[i] ) /*没有 " 或只有单个 " 的时候,按空格将命令符拆分*/
{
par[j] = buf[i];
j++;
}else
{
par[j] = '\0';
if ( 0 != strlen(par) ) /*避免多个空格*/
{
puts(par);
j = 0;
n++;
}
}
i++;
}
}
}
/*用来输出命令符个数,因题目要求需先输出命令符个数,故有此函数,内容与上函数相同*/
void Count ( CHAR buf[] )
{
LONG n, i, j;
CHAR par[N] = "";
n = i = j = 0;
strcat ( buf, " " );
while ( '\0' != buf[i] )
{
if ( 0 == j && '"' == buf[i] && 1 == Find ( buf + i + 1 ))
{
while ( '"' != buf[i+1] )
{
par[j] = buf[i+1];
j++;
i++;
}
par[j] = '\0';
i+=2;
}else
{
if ( ' ' != buf[i] )
{
par[j] = buf[i];
j++;
}else
{
par[j] = '\0';
if ( 0 != strlen(par) )
{
j = 0;
n++;
}
}
i++;
}
}
printf ( "n = %d\n", n );
}
void main()
{
CHAR buf[N] = "";
printf ( "请输入参数并用空格间隔:" );
gets ( buf );
Count ( buf );
Print ( buf );
return;
}