题目描述
在命令行输入如下命令:
xcopy /s c:\ d:\,
各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:\
参数4: 字符串d:\
请编写一个参数解析程序,实现将命令行各个参数解析出来。
解析规则:
1.参数分隔符为空格
2.对于用“”包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:\program files” “d:\”时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将“”去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入
输入描述:
输入一行字符串,可以有空格
输出描述:
输出参数个数,分解后的参数,每个参数都独占一行
以下是我的通过代码。
#include<stdlib.h>
#include<stdio.h>
int main()
{
char a[1000];//参数字符数组
char c;
int i=0,n=0,j=0,k=0;
int p[100];//参数之间空格为止记录数组
while((c=getchar())!='\n')//单个读取参数字符,直到回车为止
{
if(c=='"')//这个if处理用引号括起来的参数
{
while((c=getchar())!='"')//不断读取引号内的字符直到引号结束,这样就可以把引号内的空格读入,同时没有读入引号
{
a[i]=c;
i++;
}
}
else
if(c==32)//参数之间的分隔空格的处理
{
n++;//n记录参数之间空格的个数 ,参数个数为n+1
a[i]=c;
p[j]=i;//记录空格的位置,之后输出参数的时候要用
j++;
i++;
}
else
{
a[i]=c;
i++;
}
}
printf("%d\n",n+1);
j=0;
while(j<i)//遍历参数数组
{
if(j==p[k]){如果遍历到空格位置,不输出空格而是换行
printf("\n");
k++;
j++;
}
else
{
printf("%c",a[j]);
j++;
}
}
}
我的思路是第一遍循环先单个读入字符,记录下参数分隔空格的位置和个数,去掉引号,放入字符数组中。然后输出参数个数。
第二遍循环根据当前数组遍历的位置判断是否为参数分隔空格处,如果是则输出换行符,不是的话则一次输出参数。
运行结果如图所示。
C语言知识点回顾:
字符串读取的三种方式:
1.getchar()
读取单个字符,以换行判断是否结束输入。
2.gets()
可以接收有空格的字符串,以换行结束输入,最后默认写入\0作为字符串结束标志。
3.scanf("%s",str)
只接收空格之前的字符串,但是若写成scanf("[^\n]",str),则可以有空格。
欢迎讨论交流~